summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc3
-rw-r--r--compiler-rt/lib/asan/tests/asan_test.cc36
2 files changed, 38 insertions, 1 deletions
diff --git a/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc b/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc
index 3fdb0098386..df625b07525 100644
--- a/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc
+++ b/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc
@@ -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),
diff --git a/compiler-rt/lib/asan/tests/asan_test.cc b/compiler-rt/lib/asan/tests/asan_test.cc
index 3a67bd0c30d..ae71415b39f 100644
--- a/compiler-rt/lib/asan/tests/asan_test.cc
+++ b/compiler-rt/lib/asan/tests/asan_test.cc
@@ -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
OpenPOWER on IntegriCloud