]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use indirect call in adjustSignalStack to avoid nosplit overflow
authorDamien Neil <dneil@google.com>
Tue, 19 Nov 2024 17:04:11 +0000 (09:04 -0800)
committerDamien Neil <dneil@google.com>
Tue, 19 Nov 2024 19:40:27 +0000 (19:40 +0000)
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 <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/signal_unix.go

index a056e21a2f9cee90a993bb518cd025634de6a9bc..96628d6baae910984cb1cccc883d95944673efe3 100644 (file)
@@ -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