[compiler-rt] [sanitizer] Add cloak_sanitizer_signal_handlers runtime option (PR #162746)
Thurston Dang via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 10 12:59:45 PDT 2025
================
@@ -56,19 +63,53 @@ INTERCEPTOR(uptr, bsd_signal, int signum, uptr handler) {
INTERCEPTOR(uptr, signal, int signum, uptr handler) {
SIGNAL_INTERCEPTOR_ENTER();
if (GetHandleSignalMode(signum) == kHandleSignalExclusive)
+ // The user can neither view nor change the signal handler, regardless of
+ // the cloak_sanitizer_signal_handlers setting. This differs from
+ // sigaction().
return (uptr) nullptr;
+ uptr ret;
SIGNAL_INTERCEPTOR_SIGNAL_IMPL(signal, signum, handler);
+
+ if (signum >= 0 && signum < MaxSignals &&
+ signal_handler_is_from_sanitizer[signum] && ret != sig_err) {
+ // If the user sets a signal handler, it is never cloaked, even if they
+ // reuse a sanitizer's signal handler.
+ signal_handler_is_from_sanitizer[signum] = false;
+
+ ret = sig_dfl;
+ }
+
+ return ret;
}
#define INIT_SIGNAL COMMON_INTERCEPT_FUNCTION(signal)
INTERCEPTOR(int, sigaction_symname, int signum,
const __sanitizer_sigaction *act, __sanitizer_sigaction *oldact) {
SIGNAL_INTERCEPTOR_ENTER();
+
if (GetHandleSignalMode(signum) == kHandleSignalExclusive) {
if (!oldact) return 0;
act = nullptr;
+ // If cloak_sanitizer_signal_handlers=true, the user can neither view nor
+ // change the signal handle.
+ // If false, the user can view but not change the signal handler. This
+ // differs from signal().
}
+ int ret;
SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact);
+
+ if (signum >= 0 && signum < MaxSignals &&
+ signal_handler_is_from_sanitizer[signum] && ret == 0) {
+ if (act)
----------------
thurstond wrote:
Done: https://github.com/llvm/llvm-project/pull/162746/commits/65468343534015455b18f7db64885511bbfb109b
https://github.com/llvm/llvm-project/pull/162746
More information about the llvm-commits
mailing list