]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: clear m.gsignal when the M exits
authorCherry Zhang <cherryyz@google.com>
Tue, 29 Oct 2019 21:07:21 +0000 (17:07 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 29 Oct 2019 22:56:47 +0000 (22:56 +0000)
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: Ian Lance Taylor <iant@golang.org>
src/runtime/proc.go

index 60a15c1e9cace36d9dccd12156a7fd2cc7107055..fc8aa3330a0bbc125b7b3a990fd17582a3e2c5c1 100644 (file)
@@ -1190,6 +1190,11 @@ func mexit(osStack bool) {
        // Free the gsignal stack.
        if m.gsignal != nil {
                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.