]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: guard against runtime/sema* ops on Darwin signal stack.
authorDavid Chase <drchase@google.com>
Mon, 14 Aug 2023 17:20:45 +0000 (13:20 -0400)
committerDavid Chase <drchase@google.com>
Wed, 16 Aug 2023 17:51:47 +0000 (17:51 +0000)
These operations misbehave and cause hangs and flakes.
Fail hard if they are attempted.

Tested by backing out the Darwin-profiling-hang fix
CL 518836 and running run.bash, the guard panicked in
runtime/pprof tests, as expected/hoped.

Updates #61768

Change-Id: I89b6f85745fbaa2245141ea98f584afc5d6b133e
Reviewed-on: https://go-review.googlesource.com/c/go/+/519275
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/runtime/os_darwin.go

index 105de47a1f53bfd27a472502749dc17a76d3464f..be2909532935969649b29d45a854d68cae7b6a0d 100644 (file)
@@ -41,7 +41,12 @@ func semasleep(ns int64) int32 {
        if ns >= 0 {
                start = nanotime()
        }
-       mp := getg().m
+       g := getg()
+       mp := g.m
+       if g == mp.gsignal {
+               // sema sleep/wakeup are implemented with pthreads, which are not async-signal-safe on Darwin.
+               throw("semasleep on Darwin signal stack")
+       }
        pthread_mutex_lock(&mp.mutex)
        for {
                if mp.count > 0 {
@@ -70,6 +75,9 @@ func semasleep(ns int64) int32 {
 
 //go:nosplit
 func semawakeup(mp *m) {
+       if g := getg(); g == g.m.gsignal {
+               throw("semawakeup on Darwin signal stack")
+       }
        pthread_mutex_lock(&mp.mutex)
        mp.count++
        if mp.count > 0 {