OSDN Git Service

libsigchain: intercept bsd_signal on lp32
authorDimitry Ivanov <dimitry@google.com>
Mon, 1 Aug 2016 18:19:03 +0000 (11:19 -0700)
committerDimitry Ivanov <dimitry@google.com>
Mon, 1 Aug 2016 21:14:06 +0000 (14:14 -0700)
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

sigchainlib/sigchain.cc
sigchainlib/version-script32.txt [new file with mode: 0644]
sigchainlib/version-script64.txt [moved from sigchainlib/version-script.txt with 100% similarity]

index f29301d..c1efecd 100644 (file)
@@ -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<sighandler_t>(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 (file)
index 0000000..eec9103
--- /dev/null
@@ -0,0 +1,15 @@
+{
+global:
+  ClaimSignalChain;
+  UnclaimSignalChain;
+  InvokeUserSignalHandler;
+  InitializeSignalChain;
+  EnsureFrontOfChain;
+  SetSpecialSignalHandlerFn;
+  bsd_signal;
+  sigaction;
+  signal;
+  sigprocmask;
+local:
+  *;
+};