-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
- Loading branch information
Bryan C. Mills
committed
Jul 20, 2017
1 parent
dc7fa5f
commit f5eb871
Showing
2 changed files
with
36 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |