diff options
Diffstat (limited to 'libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc')
-rw-r--r-- | libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc b/libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc index b278f82ce03..7ec63396d79 100644 --- a/libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc +++ b/libsanitizer/sanitizer_common/sanitizer_signal_interceptors.inc @@ -16,10 +16,26 @@ using namespace __sanitizer; +#if SANITIZER_NETBSD +#define sigaction_symname __sigaction14 +#else +#define sigaction_symname sigaction +#endif + +#ifndef SIGNAL_INTERCEPTOR_SIGNAL_IMPL +#define SIGNAL_INTERCEPTOR_SIGNAL_IMPL(func, signum, handler) \ + { return REAL(func)(signum, handler); } +#endif + +#ifndef SIGNAL_INTERCEPTOR_SIGACTION_IMPL +#define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact) \ + { return REAL(sigaction_symname)(signum, act, oldact); } +#endif + #if SANITIZER_INTERCEPT_BSD_SIGNAL -INTERCEPTOR(void *, bsd_signal, int signum, void *handler) { +INTERCEPTOR(uptr, bsd_signal, int signum, uptr handler) { if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0; - return REAL(bsd_signal)(signum, handler); + SIGNAL_INTERCEPTOR_SIGNAL_IMPL(bsd_signal, signum, handler); } #define INIT_BSD_SIGNAL COMMON_INTERCEPT_FUNCTION(bsd_signal) #else // SANITIZER_INTERCEPT_BSD_SIGNAL @@ -27,31 +43,35 @@ INTERCEPTOR(void *, bsd_signal, int signum, void *handler) { #endif // SANITIZER_INTERCEPT_BSD_SIGNAL #if SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION -INTERCEPTOR(void *, signal, int signum, void *handler) { - if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return nullptr; - return REAL(signal)(signum, handler); +INTERCEPTOR(uptr, signal, int signum, uptr handler) { + if (GetHandleSignalMode(signum) == kHandleSignalExclusive) + return (uptr) nullptr; + SIGNAL_INTERCEPTOR_SIGNAL_IMPL(signal, signum, handler); } #define INIT_SIGNAL COMMON_INTERCEPT_FUNCTION(signal) -INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act, - struct sigaction *oldact) { +INTERCEPTOR(int, sigaction_symname, int signum, + const __sanitizer_sigaction *act, __sanitizer_sigaction *oldact) { if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0; - return REAL(sigaction)(signum, act, oldact); + SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact); } -#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction) +#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction_symname) namespace __sanitizer { int real_sigaction(int signum, const void *act, void *oldact) { - return REAL(sigaction)(signum, (const struct sigaction *)act, - (struct sigaction *)oldact); + return REAL(sigaction_symname)(signum, (const __sanitizer_sigaction *)act, + (__sanitizer_sigaction *)oldact); } } // namespace __sanitizer #else // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION #define INIT_SIGNAL #define INIT_SIGACTION // We need to have defined REAL(sigaction) on other systems. -DEFINE_REAL(int, sigaction, int signum, const struct sigaction *act, - struct sigaction *oldact) +namespace __sanitizer { +struct __sanitizer_sigaction; +} +DEFINE_REAL(int, sigaction, int signum, const __sanitizer_sigaction *act, + __sanitizer_sigaction *oldact) #endif // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION static void InitializeSignalInterceptors() { |