aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2020-05-29 16:01:17 -0400
committerMichael Pratt <mpratt@google.com>2020-05-29 21:18:16 +0000
commit0aed2a4133d4a6cbefa9f86096500009bacc8e4c (patch)
treed417fd338e6ada2a3a1487d5ffc532b02f444771
parent6ad5f4e334a7b2cecf319d7f4aecfaa8d790395e (diff)
downloadgo-0aed2a4133d4a6cbefa9f86096500009bacc8e4c.tar.gz
go-0aed2a4133d4a6cbefa9f86096500009bacc8e4c.zip
runtime: no SIGWINCH to pgrp while GDB is running
When run with stdin == /dev/null and stdout/stderr == pipe (i.e., as os/exec.Command.CombinedOutput), GDB suffers from a bug (https://sourceware.org/bugzilla/show_bug.cgi?id=26056) that causes SIGSEGV when sent a SIGWINCH signal. Package runtime tests TestEINTR and TestSignalDuringExec both send SIGWINCH signals to the entire process group, thus including GDB if one of the GDB tests is running in parallel. TestEINTR only intends its signals for the current process, so it is changed to do so. TestSignalDuringExec, really does want its signals to go to children. However, it does not call t.Parallel(), so it won't run at the same time as GDB tests. This is a simple fix, but GDB is vulnerable, so we must be careful not to add new parallel tests that send SIGWINCH to the entire process group. Fixes #39021 Change-Id: I803606fb000f08c65c1b10ec554d4ef6819e5dd5 Reviewed-on: https://go-review.googlesource.com/c/go/+/235557 Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Bryan C. Mills <bcmills@google.com>
-rw-r--r--src/runtime/runtime-gdb_test.go6
-rw-r--r--src/runtime/testdata/testprogcgo/eintr.go3
2 files changed, 8 insertions, 1 deletions
diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go
index 2818ada3e0..7cfd5b95dd 100644
--- a/src/runtime/runtime-gdb_test.go
+++ b/src/runtime/runtime-gdb_test.go
@@ -19,6 +19,12 @@ import (
"testing"
)
+// NOTE: In some configurations, GDB will segfault when sent a SIGWINCH signal.
+// Some runtime tests send SIGWINCH to the entire process group, so those tests
+// must never run in parallel with GDB tests.
+//
+// See issue 39021 and https://sourceware.org/bugzilla/show_bug.cgi?id=26056.
+
func checkGdbEnvironment(t *testing.T) {
testenv.MustHaveGoBuild(t)
switch runtime.GOOS {
diff --git a/src/runtime/testdata/testprogcgo/eintr.go b/src/runtime/testdata/testprogcgo/eintr.go
index 9d9435d9a6..791ff1bedc 100644
--- a/src/runtime/testdata/testprogcgo/eintr.go
+++ b/src/runtime/testdata/testprogcgo/eintr.go
@@ -89,8 +89,9 @@ func spin() (float64, []byte) {
func winch() {
ticker := time.NewTicker(100 * time.Microsecond)
defer ticker.Stop()
+ pid := syscall.Getpid()
for n := 10; n > 0; n-- {
- syscall.Kill(0, syscall.SIGWINCH)
+ syscall.Kill(pid, syscall.SIGWINCH)
<-ticker.C
}
}