Home | History | Annotate | Download | only in src
      1 // Copyright 2017 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package main
      6 
      7 // This program hung when run under the C/C++ ThreadSanitizer. TSAN installs a
      8 // libc interceptor that writes signal handlers to a global variable within the
      9 // TSAN runtime instead of making a sigaction system call. A bug in
     10 // syscall.runtime_AfterForkInChild corrupted TSAN's signal forwarding table
     11 // during calls to (*os/exec.Cmd).Run, causing the parent process to fail to
     12 // invoke signal handlers.
     13 
     14 import (
     15 	"fmt"
     16 	"os"
     17 	"os/exec"
     18 	"os/signal"
     19 	"syscall"
     20 )
     21 
     22 import "C"
     23 
     24 func main() {
     25 	ch := make(chan os.Signal)
     26 	signal.Notify(ch, syscall.SIGUSR1)
     27 
     28 	if err := exec.Command("true").Run(); err != nil {
     29 		fmt.Fprintf(os.Stderr, "Unexpected error from `true`: %v", err)
     30 		os.Exit(1)
     31 	}
     32 
     33 	syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
     34 	<-ch
     35 }
     36