From: Damien Neil Date: Tue, 19 Nov 2024 17:04:11 +0000 (-0800) Subject: runtime: use indirect call in adjustSignalStack to avoid nosplit overflow X-Git-Tag: go1.24rc1~249 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=944df9a7516021f0405cd8adb1e6894ae9872cb5;p=gostls13.git 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 --- diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index a056e21a2f..96628d6baa 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