From 827584e2f3a76c6a94447197fc6dcb8152382369 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Tue, 17 Sep 2019 07:49:47 +0000 Subject: [PATCH] runtime: check for nil g in msancall() on arm64 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 Reviewed-by: Ian Lance Taylor Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/runtime/msan_arm64.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/msan_arm64.s b/src/runtime/msan_arm64.s index 4dfe5e31339..5e29f1aefbb 100644 --- a/src/runtime/msan_arm64.s +++ b/src/runtime/msan_arm64.s @@ -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