diff options
author | Ian Lance Taylor <iant@golang.org> | 2020-10-27 16:09:40 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-11-20 20:38:12 +0000 |
commit | efd204ccf78e16ee6792079ba70456ed425cb9c3 (patch) | |
tree | 1f37f9e107e7218377e72064d8e6fc2d3257603a /src/runtime/signal_unix.go | |
parent | 730d5f42f919f948ff2841581ecec6fe4b465aee (diff) | |
download | go-efd204ccf78e16ee6792079ba70456ed425cb9c3.tar.gz go-efd204ccf78e16ee6792079ba70456ed425cb9c3.zip |
[release-branch.go1.15] runtime: block signals in needm before allocating M
Otherwise, if a signal occurs just after we allocated the M,
we can deadlock if the signal handler needs to allocate an M
itself.
For #42207
Fixes #42636
Change-Id: I76f44547f419e8b1c14cbf49bf602c6e645d8c14
Reviewed-on: https://go-review.googlesource.com/c/go/+/265759
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
(cherry picked from commit 368c40116434532dc0b53b72fa04788ca6742898)
Reviewed-on: https://go-review.googlesource.com/c/go/+/271847
Diffstat (limited to 'src/runtime/signal_unix.go')
-rw-r--r-- | src/runtime/signal_unix.go | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 80fd2d6604..003c7b0bc8 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -1032,15 +1032,15 @@ func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool { return true } -// msigsave saves the current thread's signal mask into mp.sigmask. +// sigsave saves the current thread's signal mask into *p. // This is used to preserve the non-Go signal mask when a non-Go // thread calls a Go function. // This is nosplit and nowritebarrierrec because it is called by needm // which may be called on a non-Go thread with no g available. //go:nosplit //go:nowritebarrierrec -func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) +func sigsave(p *sigset) { + sigprocmask(_SIG_SETMASK, nil, p) } // msigrestore sets the current thread's signal mask to sigmask. @@ -1112,7 +1112,7 @@ func minitSignalStack() { // thread's signal mask. When this is called all signals have been // blocked for the thread. This starts with m.sigmask, which was set // either from initSigmask for a newly created thread or by calling -// msigsave if this is a non-Go thread calling a Go function. It +// sigsave if this is a non-Go thread calling a Go function. It // removes all essential signals from the mask, thus causing those // signals to not be blocked. Then it sets the thread's signal mask. // After this is called the thread can receive signals. |