From 612154674d2a77128914b2dd39ab0d7cd4266c2c Mon Sep 17 00:00:00 2001 From: MrLop Date: Fri, 14 Feb 2025 15:20:01 +0800 Subject: [PATCH] [Compiler-RT][HWASAN] Add Special Signal for Exclusive Handler On OHOS register normal signal handler through sigaction. Register exclusive signal handler through add_special_signal_handler Signed-off-by: MrLop --- .../sanitizer_posix_libcdep.cpp | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp index 689a94deccc0..6c2a288d6a84 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp @@ -199,9 +199,9 @@ void UnsetAlternateSignalStack() { static void MaybeInstallSigaction(int signum, SignalHandlerType handler) { +#if !SANITIZER_OHOS if (GetHandleSignalMode(signum) == kHandleSignalNo) return; -#if !SANITIZER_OHOS struct sigaction sigact; internal_memset(&sigact, 0, sizeof(sigact)); sigact.sa_sigaction = (sa_sigaction_t)handler; @@ -212,17 +212,33 @@ static void MaybeInstallSigaction(int signum, CHECK_EQ(0, internal_sigaction(signum, &sigact, nullptr)); VReport(1, "Installed the sigaction for signal %d\n", signum); #else -// OHOS_LOCAL begin - typedef bool (*sc)(int, siginfo_t *, void *); - sc h = (sc)handler; - struct signal_chain_action sigchain = { - .sca_sigaction = h, - .sca_mask = {}, - .sca_flags = SA_SIGINFO | SA_NODEFER, - }; - // This is a void function for OHOS. When there are too many registered - // functions, an internal error is reported. CHECK is not required. - add_special_signal_handler(signum, &sigchain); +// OHOS_LOCAL begin + HandleSignalMode mode = GetHandleSignalMode(signum); + + if (mode == kHandleSignalNo) return; + if (mode == kHandleSignalYes) { + struct sigaction sigact; + internal_memset(&sigact, 0, sizeof(sigact)); + sigact.sa_sigaction = (sa_sigaction_t)handler; + // 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, nullptr)); + VReport(1, "Installed the sigaction for signal %d\n", signum); + } else { + typedef bool (*sc)(int, siginfo_t *, void *); + sc h = (sc)handler; + struct signal_chain_action sigchain = { + .sca_sigaction = h, + .sca_mask = {}, + .sca_flags = SA_SIGINFO | SA_NODEFER, + }; + // This is a void function for OHOS. When there are too many registered + // functions, an internal error is reported. CHECK is not required. + add_special_signal_handler(signum, &sigchain); + VReport(1, "Installed the sigaction for signal %d\n", signum); + } // OHOS_LOCAL end #endif } -- Gitee