diff options
| -rw-r--r-- | compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc | 3 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/tests/asan_test.cc | 36 |
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 |

