Commit ea7d9e6a authored by Bryan C. Mills's avatar Bryan C. Mills Committed by Bryan Mills

runtime: check for nil g and m in msanread

fixes #18707.

Change-Id: Ibc4efef01197799f66d10bfead22faf8ac00473c
Reviewed-on: https://go-review.googlesource.com/35452
Run-TryBot: Bryan Mills <bcmills@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 6593d865
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This program segfaulted during libpreinit when built with -msan:
// http://golang.org/issue/18707
package main
import "C"
func main() {}
...@@ -68,6 +68,25 @@ fi ...@@ -68,6 +68,25 @@ fi
status=0 status=0
testmsanshared() {
goos=$(go env GOOS)
suffix="-installsuffix testsanitizers"
libext="so"
if [ "$goos" == "darwin" ]; then
libext="dylib"
fi
go build -msan -buildmode=c-shared $suffix -o ${TMPDIR}/libmsanshared.$libext msan_shared.go
echo 'int main() { return 0; }' > ${TMPDIR}/testmsanshared.c
$CC $(go env GOGCCFLAGS) -fsanitize=memory -o ${TMPDIR}/testmsanshared ${TMPDIR}/testmsanshared.c ${TMPDIR}/libmsanshared.$libext
if ! LD_LIBRARY_PATH=. ${TMPDIR}/testmsanshared; then
echo "FAIL: msan_shared"
status=1
fi
rm -f ${TMPDIR}/{testmsanshared,testmsanshared.c,libmsanshared.$libext}
}
if test "$msan" = "yes"; then if test "$msan" = "yes"; then
if ! go build -msan std; then if ! go build -msan std; then
echo "FAIL: build -msan std" echo "FAIL: build -msan std"
...@@ -108,6 +127,8 @@ if test "$msan" = "yes"; then ...@@ -108,6 +127,8 @@ if test "$msan" = "yes"; then
echo "FAIL: msan_fail" echo "FAIL: msan_fail"
status=1 status=1
fi fi
testmsanshared
fi fi
if test "$tsan" = "yes"; then if test "$tsan" = "yes"; then
......
...@@ -28,9 +28,11 @@ const msanenabled = true ...@@ -28,9 +28,11 @@ const msanenabled = true
// the runtime, but operations like a slice copy can call msanread // the runtime, but operations like a slice copy can call msanread
// anyhow for values on the stack. Just ignore msanread when running // anyhow for values on the stack. Just ignore msanread when running
// on the system stack. The other msan functions are fine. // on the system stack. The other msan functions are fine.
//
//go:nosplit
func msanread(addr unsafe.Pointer, sz uintptr) { func msanread(addr unsafe.Pointer, sz uintptr) {
g := getg() g := getg()
if g == g.m.g0 || g == g.m.gsignal { if g == nil || g.m == nil || g == g.m.g0 || g == g.m.gsignal {
return return
} }
domsanread(addr, sz) domsanread(addr, sz)
......
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