Intercept signal() and sigaction() within the dynamic runtime on Mac.
authorAlexander Potapenko <glider@google.com>
Tue, 18 Sep 2012 12:49:51 +0000 (12:49 +0000)
committerAlexander Potapenko <glider@google.com>
Tue, 18 Sep 2012 12:49:51 +0000 (12:49 +0000)
Add a test that ensures that ASan does not allow to override the signal handlers.

llvm-svn: 164118

compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc
compiler-rt/lib/asan/tests/asan_test.cc

index 3fdb009838642e165887f1dd852699c9999391e3..df625b0752504f4fdce7752821cf1fba93ee172e 100644 (file)
@@ -98,6 +98,9 @@ const interpose_substitution substitutions[]
   INTERPOSE_FUNCTION(dispatch_source_set_event_handler),
   INTERPOSE_FUNCTION(dispatch_source_set_cancel_handler),
 
+  INTERPOSE_FUNCTION(signal),
+  INTERPOSE_FUNCTION(sigaction),
+
   INTERPOSE_FUNCTION(__CFInitialize),
   INTERPOSE_FUNCTION(CFStringCreateCopy),
   INTERPOSE_FUNCTION(free),
index 3a67bd0c30d4cb415e9fd922d7701377987f663c..ae71415b39f380d3b1a951fcf7c9a788f6d29d4d 100644 (file)
@@ -356,9 +356,43 @@ TEST(AddressSanitizer, OutOfMemoryTest) {
 }
 
 #if ASAN_NEEDS_SEGV
+namespace {
+
+const char kUnknownCrash[] = "AddressSanitizer crashed on unknown address";
+const char kOverriddenHandler[] = "ASan signal handler has been overridden\n";
+
 TEST(AddressSanitizer, WildAddressTest) {
   char *c = (char*)0x123;
-  EXPECT_DEATH(*c = 0, "AddressSanitizer crashed on unknown address");
+  EXPECT_DEATH(*c = 0, kUnknownCrash);
+}
+
+void my_sigaction_sighandler(int, siginfo_t*, void*) {
+  fprintf(stderr, kOverriddenHandler);
+  exit(1);
+}
+
+void my_signal_sighandler(int) {
+  fprintf(stderr, kOverriddenHandler);
+  exit(1);
+}
+
+TEST(AddressSanitizer, SignalTest) {
+  struct sigaction sigact;
+  memset(&sigact, 0, sizeof(sigact));
+  sigact.sa_sigaction = my_sigaction_sighandler;
+  sigact.sa_flags = SA_SIGINFO;
+  // ASan should silently ignore sigaction()...
+  EXPECT_EQ(0, sigaction(SIGSEGV, &sigact, 0));
+#ifdef __APPLE__
+  EXPECT_EQ(0, sigaction(SIGBUS, &sigact, 0));
+#endif
+  char *c = (char*)0x123;
+  EXPECT_DEATH(*c = 0, kUnknownCrash);
+  // ... and signal().
+  EXPECT_EQ(0, signal(SIGSEGV, my_signal_sighandler));
+  EXPECT_DEATH(*c = 0, kUnknownCrash);
+}
+
 }
 #endif