1
0
mirror of https://github.com/golang/go synced 2024-11-17 20:54:48 -07:00

runtime: fix crashing with foreign signal handlers on Darwin

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>
This commit is contained in:
Elias Naur 2017-08-11 19:46:45 +02:00
parent 51ba2bb819
commit 057a34a281

View File

@ -398,6 +398,9 @@ func dieFromSignal(sig uint32) {
// First, try any signal handler installed before the runtime // First, try any signal handler installed before the runtime
// initialized. // initialized.
fn := atomic.Loaduintptr(&fwdSig[sig]) 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) setsig(sig, fn)
raise(sig) raise(sig)