Commit fd33b2c9 authored by Ian Lance Taylor's avatar Ian Lance Taylor

runtime: when disabling SIGPROF handler, ignore SIGPROF

If the runtime disables the SIGPROF handler, because this is Go code
that is linked into a non-Go program, then don't go back to the
default handling of SIGPROF; just start ignoring SIGPROF.
Otherwise the program can get killed by a stray SIGPROF that is
delivered, presumably to a different thread, after profiling is disabled.

Fixes #19320

Change-Id: Ifebae477d726699c8c82c867604b73110c1cf262
Reviewed-on: https://go-review.googlesource.com/c/go/+/200740
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
parent 33fac9ba
......@@ -242,10 +242,26 @@ func setProcessCPUProfiler(hz int32) {
}
} else {
// If the Go signal handler should be disabled by default,
// disable it if it is enabled.
// switch back to the signal handler that was installed
// when we enabled profiling. We don't try to handle the case
// of a program that changes the SIGPROF handler while Go
// profiling is enabled.
//
// If no signal handler was installed before, then start
// ignoring SIGPROF signals. We do this, rather than change
// to SIG_DFL, because there may be a pending SIGPROF
// signal that has not yet been delivered to some other thread.
// If we change to SIG_DFL here, the program will crash
// when that SIGPROF is delivered. We assume that programs
// that use profiling don't want to crash on a stray SIGPROF.
// See issue 19320.
if !sigInstallGoHandler(_SIGPROF) {
if atomic.Cas(&handlingSig[_SIGPROF], 1, 0) {
setsig(_SIGPROF, atomic.Loaduintptr(&fwdSig[_SIGPROF]))
h := atomic.Loaduintptr(&fwdSig[_SIGPROF])
if h == _SIG_DFL {
h = _SIG_IGN
}
setsig(_SIGPROF, h)
}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment