From: Dimitry Ivanov Date: Mon, 1 Aug 2016 18:19:03 +0000 (-0700) Subject: libsigchain: intercept bsd_signal on lp32 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=82b67b9897ac0f6791dddeb98c4b876418a6a162;p=android-x86%2Fart.git libsigchain: intercept bsd_signal on lp32 bsd_signal is a deprecated synonym for the signal. Nevertheless there are apps and libraries calling this function. libsigchain needs to intercept these calls and handle them the same way it handles signal() call. Bug: http://b/30562229 Test: readelf --dyn-sym app_process32 and check that bsd_signal is exported readelf --dyn-sym app_process64 and check that bsd_signal is not exported Change-Id: I3aa41632bb015568d8524a82f1c97e4443ec0d6c --- diff --git a/sigchainlib/sigchain.cc b/sigchainlib/sigchain.cc index f29301d22..c1efecd19 100644 --- a/sigchainlib/sigchain.cc +++ b/sigchainlib/sigchain.cc @@ -233,7 +233,7 @@ extern "C" int sigaction(int signal, const struct sigaction* new_action, struct return linked_sigaction(signal, new_action, old_action); } -extern "C" sighandler_t signal(int signal, sighandler_t handler) { +static sighandler_t signal_impl(int signal, sighandler_t handler) { struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_handler = handler; @@ -272,6 +272,16 @@ extern "C" sighandler_t signal(int signal, sighandler_t handler) { return reinterpret_cast(sa.sa_handler); } +extern "C" sighandler_t signal(int signal, sighandler_t handler) { + return signal_impl(signal, handler); +} + +#if !defined(__LP64__) +extern "C" sighandler_t bsd_signal(int signal, sighandler_t handler) { + return signal_impl(signal, handler); +} +#endif + extern "C" int sigprocmask(int how, const sigset_t* bionic_new_set, sigset_t* bionic_old_set) { const sigset_t* new_set_ptr = bionic_new_set; sigset_t tmpset; diff --git a/sigchainlib/version-script32.txt b/sigchainlib/version-script32.txt new file mode 100644 index 000000000..eec9103d3 --- /dev/null +++ b/sigchainlib/version-script32.txt @@ -0,0 +1,15 @@ +{ +global: + ClaimSignalChain; + UnclaimSignalChain; + InvokeUserSignalHandler; + InitializeSignalChain; + EnsureFrontOfChain; + SetSpecialSignalHandlerFn; + bsd_signal; + sigaction; + signal; + sigprocmask; +local: + *; +}; diff --git a/sigchainlib/version-script.txt b/sigchainlib/version-script64.txt similarity index 100% rename from sigchainlib/version-script.txt rename to sigchainlib/version-script64.txt