diff options
-rw-r--r-- | compiler-rt/lib/asan/asan_interceptors.cc | 14 | ||||
-rw-r--r-- | compiler-rt/lib/asan/tests/asan_test.cc | 42 |
2 files changed, 8 insertions, 48 deletions
diff --git a/compiler-rt/lib/asan/asan_interceptors.cc b/compiler-rt/lib/asan/asan_interceptors.cc index 6d7e63b4092..6bf5fa48f57 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cc +++ b/compiler-rt/lib/asan/asan_interceptors.cc @@ -339,19 +339,21 @@ INTERCEPTOR(int, pthread_create, void *thread, #endif // !_WIN32 #if ASAN_INTERCEPT_SIGNAL_AND_SIGACTION +const char kOverrideSighandlerWarning[] = + "Warning: client program overrides the handler for signal %d.\n"; INTERCEPTOR(void*, signal, int signum, void *handler) { - if (!AsanInterceptsSignal(signum)) { - return REAL(signal)(signum, handler); + if (AsanInterceptsSignal(signum)) { + Report(kOverrideSighandlerWarning, signum); } - return NULL; + return REAL(signal)(signum, handler); } INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act, struct sigaction *oldact) { - if (!AsanInterceptsSignal(signum)) { - return REAL(sigaction)(signum, act, oldact); + if (AsanInterceptsSignal(signum)) { + Report(kOverrideSighandlerWarning, signum); } - return 0; + return REAL(sigaction)(signum, act, oldact); } #elif ASAN_POSIX // We need to have defined REAL(sigaction) on posix systems. diff --git a/compiler-rt/lib/asan/tests/asan_test.cc b/compiler-rt/lib/asan/tests/asan_test.cc index 220dea92191..934d05ed808 100644 --- a/compiler-rt/lib/asan/tests/asan_test.cc +++ b/compiler-rt/lib/asan/tests/asan_test.cc @@ -210,48 +210,6 @@ TEST(AddressSanitizer, PvallocTest) { } #endif // __APPLE__ -void NoOpSignalHandler(int unused) { - fprintf(stderr, "NoOpSignalHandler (should not happen). Aborting\n"); - abort(); -} - -void NoOpSigaction(int, siginfo_t *siginfo, void *context) { - fprintf(stderr, "NoOpSigaction (should not happen). Aborting\n"); - abort(); -} - -TEST(AddressSanitizer, SignalTest) { - signal(SIGSEGV, NoOpSignalHandler); - signal(SIGILL, NoOpSignalHandler); - // If asan did not intercept sigaction NoOpSigaction will fire. - char *x = Ident((char*)malloc(5)); - EXPECT_DEATH(x[6]++, "is located 1 bytes to the right"); - free(Ident(x)); -} - -TEST(AddressSanitizer, SigactionTest) { - { - struct sigaction sigact; - memset(&sigact, 0, sizeof(sigact)); - sigact.sa_sigaction = NoOpSigaction;; - sigact.sa_flags = SA_SIGINFO; - sigaction(SIGSEGV, &sigact, 0); - } - - { - struct sigaction sigact; - memset(&sigact, 0, sizeof(sigact)); - sigact.sa_sigaction = NoOpSigaction;; - sigact.sa_flags = SA_SIGINFO; - sigaction(SIGILL, &sigact, 0); - } - - // If asan did not intercept sigaction NoOpSigaction will fire. - char *x = Ident((char*)malloc(5)); - EXPECT_DEATH(x[6]++, "is located 1 bytes to the right"); - free(Ident(x)); -} - void *TSDWorker(void *test_key) { if (test_key) { pthread_setspecific(*(pthread_key_t*)test_key, (void*)0xfeedface); |