From c265d98447efb6939ddb65e561e838edc47a9159 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 7 Jul 2025 16:30:41 -0700 Subject: [PATCH] [libFuzzer] always install signal handler with SA_ONSTACK SA_ONSTACK is required for certain runtimes that use small stacks, for instance the Go runtime. See https://github.com/golang/go/issues/49075 SA_ONSTACK is a no-op unless someone also calls sigaltstack. --- compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp b/compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp index 392c1e5be4eea..b6cc3bcf8a3f3 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp @@ -78,10 +78,14 @@ static void SetSigaction(int signum, } struct sigaction new_sigact = {}; - // Address sanitizer needs SA_ONSTACK (causing the signal handler to run on a - // dedicated stack) in order to be able to detect stack overflows; keep the - // flag if it's set. - new_sigact.sa_flags = SA_SIGINFO | (sigact.sa_flags & SA_ONSTACK); + // SA_ONSTACK is required for certain runtimes that use small stacks, for + // instance the Go runtime. + // See https://github.com/golang/go/issues/49075 + // Address sanitizer also wants SA_ONSTACK, and the fuzzer and sanitizer + // often run together. + // SA_ONSTACK is a no-op unless someone also calls sigaltstack. That is left + // up to code that needs it. + new_sigact.sa_flags = SA_SIGINFO | SA_ONSTACK; new_sigact.sa_sigaction = callback; if (sigaction(signum, &new_sigact, nullptr)) { Printf("libFuzzer: sigaction failed with %d\n", errno);