]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check for nil g in msancall() on arm64
authorfanzha02 <fannie.zhang@arm.com>
Tue, 17 Sep 2019 07:49:47 +0000 (07:49 +0000)
committerIan Lance Taylor <iant@golang.org>
Wed, 18 Sep 2019 20:35:15 +0000 (20:35 +0000)
The current msanwrite() segfaults during libpreinit
when built with -msan on arm64. The cause is msancall()
in runtime/msan_arm64.s called by msanwrite() assumes
that it is always called with a valid g, leading to a
segfult.

This CL adds a check for nil g in msancall().

Fixes #34338

Change-Id: If4ad7e37556cd1d99346c1a7b4852651d1e4e4aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/196157
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/msan_arm64.s

index 4dfe5e313392b7fb88696e7810d767d38cfc6002..5e29f1aefbb8b3981fce5b746c2e8b2cfbeed9b1 100644 (file)
@@ -47,9 +47,10 @@ TEXT runtimeĀ·msanfree(SB), NOSPLIT, $0-16
 
 // Switches SP to g0 stack and calls (FARG). Arguments already set.
 TEXT   msancall<>(SB), NOSPLIT, $0-0
+       MOVD    RSP, R19                  // callee-saved
+       CBZ     g, g0stack                // no g, still on a system stack
        MOVD    g_m(g), R10
        MOVD    m_g0(R10), R11
-       MOVD    RSP, R19        // callee-saved
        CMP     R11, g
        BEQ     g0stack