diff options
-rw-r--r-- | lib/sanitizer_common/sanitizer_posix_libcdep.cc | 4 | ||||
-rw-r--r-- | test/asan/TestCases/zero_page_pc.cc | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/sanitizer_common/sanitizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_posix_libcdep.cc index e79563a2f..b5b24634f 100644 --- a/lib/sanitizer_common/sanitizer_posix_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_posix_libcdep.cc @@ -148,7 +148,9 @@ static void MaybeInstallSigaction(int signum, struct sigaction sigact; internal_memset(&sigact, 0, sizeof(sigact)); sigact.sa_sigaction = (sa_sigaction_t)handler; - sigact.sa_flags = SA_SIGINFO; + // Do not block the signal from being received in that signal's handler. + // Clients are responsible for handling this correctly. + sigact.sa_flags = SA_SIGINFO | SA_NODEFER; if (common_flags()->use_sigaltstack) sigact.sa_flags |= SA_ONSTACK; CHECK_EQ(0, internal_sigaction(signum, &sigact, 0)); VReport(1, "Installed the sigaction for signal %d\n", signum); diff --git a/test/asan/TestCases/zero_page_pc.cc b/test/asan/TestCases/zero_page_pc.cc new file mode 100644 index 000000000..87be154d6 --- /dev/null +++ b/test/asan/TestCases/zero_page_pc.cc @@ -0,0 +1,11 @@ +// Check that ASan correctly detects SEGV on the zero page. +// RUN: %clangxx_asan %s -o %t && not %run %t 2>&1 | FileCheck %s + +typedef void void_f(); +int main() { + void_f *func = (void_f *)0x7; + func(); + // CHECK: {{AddressSanitizer: SEGV.*(pc.*0007)}} + // CHECK: AddressSanitizer: while reporting a bug found another one. Ignoring. + return 0; +} |