]> Cypherpunks repositories - gostls13.git/commitdiff
misc/cgo/testsanitizers: add regression test for change 50251
authorBryan C. Mills <bcmills@google.com>
Thu, 20 Jul 2017 17:47:57 +0000 (13:47 -0400)
committerBryan Mills <bcmills@google.com>
Thu, 20 Jul 2017 18:43:40 +0000 (18:43 +0000)
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>
misc/cgo/testsanitizers/test.bash
misc/cgo/testsanitizers/tsan12.go [new file with mode: 0644]

index 3debb5499a0bf6116694647c184bef51323b1032..ea08f374325cbba9c13163d9685e68f2f4eda5ad 100755 (executable)
@@ -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 (file)
index 0000000..3e767ee
--- /dev/null
@@ -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
+}