From: Cherry Mui Date: Mon, 28 Aug 2023 18:59:13 +0000 (-0400) Subject: runtime: unskip TestG0StackOverflow X-Git-Tag: go1.22rc1~929 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=dfbf809f2af753db69537a9431d6419142dfe80b;p=gostls13.git runtime: unskip TestG0StackOverflow The stack bounds from pthread are not always accurate, and could cause seg fault if we run out of the actual stack space before reaching the bounds. Here we use an artificially small stack bounds to check overflow without actually running out of the system stack. Change-Id: I8067c5e1297307103b315d9d0c60120293b57aab Reviewed-on: https://go-review.googlesource.com/c/go/+/523695 Reviewed-by: Michael Pratt Run-TryBot: Cherry Mui LUCI-TryBot-Result: Go LUCI --- diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 2c990c199c..38ff602096 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -792,11 +792,6 @@ func TestRuntimePanic(t *testing.T) { func TestG0StackOverflow(t *testing.T) { testenv.MustHaveExec(t) - switch runtime.GOOS { - case "android", "darwin", "dragonfly", "freebsd", "ios", "linux", "netbsd", "openbsd": - t.Skipf("g0 stack is wrong on pthread platforms (see golang.org/issue/26061)") - } - if os.Getenv("TEST_G0_STACK_OVERFLOW") != "1" { cmd := testenv.CleanCmdEnv(exec.Command(os.Args[0], "-test.run=^TestG0StackOverflow$", "-test.v")) cmd.Env = append(cmd.Env, "TEST_G0_STACK_OVERFLOW=1") diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index c43c5d0551..008d2042cd 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -682,6 +682,15 @@ func unexportedPanicForTesting(b []byte, i int) byte { func G0StackOverflow() { systemstack(func() { + g0 := getg() + sp := getcallersp() + // The stack bounds for g0 stack is not always precise. + // Use an artificially small stack, to trigger a stack overflow + // without actually run out of the system stack (which may seg fault). + g0.stack.lo = sp - 4096 + g0.stackguard0 = g0.stack.lo + stackGuard + g0.stackguard1 = g0.stackguard0 + stackOverflow(nil) }) }