From 0aed2a4133d4a6cbefa9f86096500009bacc8e4c Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 29 May 2020 16:01:17 -0400 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Cherry Zhang Reviewed-by: Bryan C. Mills --- src/runtime/runtime-gdb_test.go | 6 ++++++ src/runtime/testdata/testprogcgo/eintr.go | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index 2818ada3e0e..7cfd5b95dd0 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 9d9435d9a6c..791ff1bedc0 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 } }