]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix crashing with foreign signal handlers on Darwin
authorElias Naur <elias.naur@gmail.com>
Fri, 11 Aug 2017 17:46:45 +0000 (19:46 +0200)
committerElias Naur <elias.naur@gmail.com>
Fri, 11 Aug 2017 22:30:12 +0000 (22:30 +0000)
The dieFromSignal runtime function attempts to forward crashing
signals to a signal handler registered before the runtime was
initialized, if any. However, on Darwin, a special signal handler
trampoline is invoked, even for non-Go signal handlers.

Clear the crashing signal's handlingSig entry to ensure sigtramp
forwards the signal.

Fixes the darwin/386 builder.

Updates #20392
Updates #19389

Change-Id: I441a3d30c672cdb21ed6d8f1e1322d7c0e5b9669
Reviewed-on: https://go-review.googlesource.com/55032
Run-TryBot: Elias Naur <elias.naur@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/signal_unix.go

index e087e145aa1cbc43fe30d22dd65a4b4cdc68fa8c..a6385a0a5e54c4dba1d3475fe13b6a562081afa5 100644 (file)
@@ -398,6 +398,9 @@ func dieFromSignal(sig uint32) {
        // First, try any signal handler installed before the runtime
        // initialized.
        fn := atomic.Loaduintptr(&fwdSig[sig])
+       // On Darwin, sigtramp is called even for non-Go signal handlers.
+       // Mark the signal as unhandled to ensure it is forwarded.
+       atomic.Store(&handlingSig[sig], 0)
        setsig(sig, fn)
        raise(sig)