From 944df9a7516021f0405cd8adb1e6894ae9872cb5 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Tue, 19 Nov 2024 09:04:11 -0800 Subject: [PATCH] runtime: use indirect call in adjustSignalStack to avoid nosplit overflow Avoids a nosplit stack overflow on OpenBSD after CL 591997 increases the adjustSignalStack stack by 16 bytes. Change-Id: I2c990de6c7cd8d2aca6e6b98133da120c8a4174b Reviewed-on: https://go-review.googlesource.com/c/go/+/629696 Reviewed-by: Cherry Mui LUCI-TryBot-Result: Go LUCI --- src/runtime/signal_unix.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index a056e21a2f9..96628d6baae 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -584,15 +584,23 @@ func adjustSignalStack(sig uint32, mp *m, gsigStack *gsignalStack) bool { } // sp is not within gsignal stack, g0 stack, or sigaltstack. Bad. + // Call indirectly to avoid nosplit stack overflow on OpenBSD. + adjustSignalStack2Indirect(sig, sp, mp, st.ss_flags&_SS_DISABLE != 0) + return false +} + +var adjustSignalStack2Indirect = adjustSignalStack2 + +//go:nosplit +func adjustSignalStack2(sig uint32, sp uintptr, mp *m, ssDisable bool) { setg(nil) needm(true) - if st.ss_flags&_SS_DISABLE != 0 { + if ssDisable { noSignalStack(sig) } else { sigNotOnStack(sig, sp, mp) } dropm() - return false } // crashing is the number of m's we have waited for when implementing