diff options
author | Cherry Zhang <cherryyz@google.com> | 2019-10-30 23:14:34 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2019-11-05 18:58:29 +0000 |
commit | fb05264fe1626c9d0b6d00d51e6c4d8d213d6dc7 (patch) | |
tree | 687730953e056a28a397b884d7b00b830cf4ea62 /src/runtime/signal_unix.go | |
parent | c3cef0bfe5f503ee016fc61e58f5ee1b78dbd962 (diff) | |
download | go-fb05264fe1626c9d0b6d00d51e6c4d8d213d6dc7.tar.gz go-fb05264fe1626c9d0b6d00d51e6c4d8d213d6dc7.zip |
runtime: setg after sigFetchG
In the normal case, sigFetchG just returns the G register. But in
the case that sigFetchG fetches the G from somewhere else, the G
register still holding an invalid value. Setg here to make sure
they match.
This is particularly useful because setGsignalStack, called by
adjustSignalStack from sigtrampgo before setg to gsignal,
accesses the G register.
Should fix #35249.
Change-Id: I64c85143cb05cdb2ecca7f9936dbd8bfec186c2d
Reviewed-on: https://go-review.googlesource.com/c/go/+/204441
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/signal_unix.go')
-rw-r--r-- | src/runtime/signal_unix.go | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 5e4361e7a1..6563186392 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -394,6 +394,7 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { } c := &sigctxt{info, ctx} g := sigFetchG(c) + setg(g) if g == nil { if sig == _SIGPROF { sigprofNonGoPC(c.sigpc()) |