]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check for nil g and m in msanread
authorBryan C. Mills <bcmills@google.com>
Wed, 18 Jan 2017 20:12:18 +0000 (15:12 -0500)
committerBryan Mills <bcmills@google.com>
Thu, 19 Jan 2017 23:06:54 +0000 (23:06 +0000)
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: Ian Lance Taylor <iant@golang.org>
misc/cgo/testsanitizers/msan_shared.go [new file with mode: 0644]
misc/cgo/testsanitizers/test.bash
src/runtime/msan.go

diff --git a/misc/cgo/testsanitizers/msan_shared.go b/misc/cgo/testsanitizers/msan_shared.go
new file mode 100644 (file)
index 0000000..966947c
--- /dev/null
@@ -0,0 +1,12 @@
+// 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() {}
index dfc6d3819a284413c64cb517f9fa2dc998897df8..4da85020d89800a3db00594b1b7937b04b6646c3 100755 (executable)
@@ -68,6 +68,25 @@ fi
 
 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 ! go build -msan std; then
        echo "FAIL: build -msan std"
@@ -108,6 +127,8 @@ if test "$msan" = "yes"; then
        echo "FAIL: msan_fail"
        status=1
     fi
+
+    testmsanshared
 fi
 
 if test "$tsan" = "yes"; then
index 7177c8e611b5dfdeff286b892b7f8a85e192c1c5..c0f3957e2891e3dadb514ef5c673bd15f64ead8c 100644 (file)
@@ -28,9 +28,11 @@ const msanenabled = true
 // the runtime, but operations like a slice copy can call msanread
 // anyhow for values on the stack. Just ignore msanread when running
 // on the system stack. The other msan functions are fine.
+//
+//go:nosplit
 func msanread(addr unsafe.Pointer, sz uintptr) {
        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
        }
        domsanread(addr, sz)