aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2017-07-20 13:47:57 -0400
committerBryan Mills <bcmills@google.com>2017-07-20 18:43:40 +0000
commitf5eb8712f802463ec9b2356e3a9d95186163c7ac (patch)
treef38e7de00ddb0194e4af5db09ae9f985ea7526ee
parentdc7fa5f6dbf1bc638d3c2b48ae394c6a2517d0ba (diff)
downloadgo-f5eb8712f802463ec9b2356e3a9d95186163c7ac.tar.gz
go-f5eb8712f802463ec9b2356e3a9d95186163c7ac.zip
misc/cgo/testsanitizers: add regression test for change 50251
http://golang.org/cl/50251 fixed a regression under TSAN. This change adds a minimal reproducer for the observed symptom. Change-Id: Ib9ad01b458b7fdec14d6c2fe3c243f9c64b3dcf2 Reviewed-on: https://go-review.googlesource.com/50371 Run-TryBot: Bryan Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rwxr-xr-xmisc/cgo/testsanitizers/test.bash1
-rw-r--r--misc/cgo/testsanitizers/tsan12.go35
2 files changed, 36 insertions, 0 deletions
diff --git a/misc/cgo/testsanitizers/test.bash b/misc/cgo/testsanitizers/test.bash
index 3debb5499a..ea08f37432 100755
--- a/misc/cgo/testsanitizers/test.bash
+++ b/misc/cgo/testsanitizers/test.bash
@@ -215,6 +215,7 @@ if test "$tsan" = "yes"; then
testtsan tsan7.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
testtsan tsan10.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
testtsan tsan11.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
+ testtsan tsan12.go "CGO_CFLAGS=-fsanitize=thread CGO_LDFLAGS=-fsanitize=thread" "-installsuffix=tsan"
testtsanshared
fi
diff --git a/misc/cgo/testsanitizers/tsan12.go b/misc/cgo/testsanitizers/tsan12.go
new file mode 100644
index 0000000000..3e767eee1f
--- /dev/null
+++ b/misc/cgo/testsanitizers/tsan12.go
@@ -0,0 +1,35 @@
+// 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.
+
+package main
+
+// This program hung when run under the C/C++ ThreadSanitizer. TSAN installs a
+// libc interceptor that writes signal handlers to a global variable within the
+// TSAN runtime instead of making a sigaction system call. A bug in
+// syscall.runtime_AfterForkInChild corrupted TSAN's signal forwarding table
+// during calls to (*os/exec.Cmd).Run, causing the parent process to fail to
+// invoke signal handlers.
+
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "os/signal"
+ "syscall"
+)
+
+import "C"
+
+func main() {
+ ch := make(chan os.Signal)
+ signal.Notify(ch, syscall.SIGUSR1)
+
+ if err := exec.Command("true").Run(); err != nil {
+ fmt.Fprintf(os.Stderr, "Unexpected error from `true`: %v", err)
+ os.Exit(1)
+ }
+
+ syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
+ <-ch
+}