Commit 15ea61c5 authored by Cherry Zhang's avatar Cherry Zhang

runtime: clear m.gsignal when the M exits

On some platforms (currently ARM and ARM64), when calling into
VDSO we store the G to the gsignal stack, if there is one, so if
we receive a signal during VDSO we can find the G.

When an M exits, it frees the gsignal stack. But m.gsignal.stack
still points to that stack. When we call nanotime on this M, we
will write to the already freed gsignal stack, which is bad.
Prevent this by unlinking the freed stack from the M.

Should fix #35235.

Change-Id: I338b1fc8ec62aae036f38afaca3484687e11a40d
Reviewed-on: https://go-review.googlesource.com/c/go/+/204158
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 20d621d2
...@@ -1190,6 +1190,11 @@ func mexit(osStack bool) { ...@@ -1190,6 +1190,11 @@ func mexit(osStack bool) {
// Free the gsignal stack. // Free the gsignal stack.
if m.gsignal != nil { if m.gsignal != nil {
stackfree(m.gsignal.stack) stackfree(m.gsignal.stack)
// On some platforms, when calling into VDSO (e.g. nanotime)
// we store our g on the gsignal stack, if there is one.
// Now the stack is freed, unlink it from the m, so we
// won't write to it when calling VDSO code.
m.gsignal = nil
} }
// Remove m from allm. // Remove m from allm.
......
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