Commit ffd7d317 authored by Ian Lance Taylor's avatar Ian Lance Taylor

runtime: unblock special glibc signals on each thread

Glibc uses some special signals for special thread operations.  These
signals will be used in programs that use cgo and invoke certain glibc
functions, such as setgid.  In order for this to work, these signals
need to not be masked by any thread.  Before this change, they were
being masked by programs that used os/signal.Notify, because it
carefully masks all non-thread-specific signals in all threads so that a
dedicated thread will collect and report those signals (see ensureSigM
in signal1_unix.go).

This change adds the two glibc special signals to the set of signals
that are unmasked in each thread.

Fixes #12498.

Change-Id: I797d71a099a2169c186f024185d44a2e1972d4ad
Reviewed-on: https://go-review.googlesource.com/14297Reviewed-by: default avatarDavid Crawshaw <crawshaw@golang.org>
parent 4ac4085f
...@@ -14,11 +14,14 @@ package cgotest ...@@ -14,11 +14,14 @@ package cgotest
import "C" import "C"
import ( import (
"os"
"os/signal"
"syscall"
"testing" "testing"
"time" "time"
) )
func testSetgid(t *testing.T) { func runTestSetgid() bool {
c := make(chan bool) c := make(chan bool)
go func() { go func() {
C.setgid(0) C.setgid(0)
...@@ -26,7 +29,21 @@ func testSetgid(t *testing.T) { ...@@ -26,7 +29,21 @@ func testSetgid(t *testing.T) {
}() }()
select { select {
case <-c: case <-c:
return true
case <-time.After(5 * time.Second): case <-time.After(5 * time.Second):
return false
}
}
func testSetgid(t *testing.T) {
if !runTestSetgid() {
t.Error("setgid hung") t.Error("setgid hung")
} }
// Now try it again after using signal.Notify.
signal.Notify(make(chan os.Signal, 1), syscall.SIGINT)
if !runTestSetgid() {
t.Error("setgid hung after signal.Notify")
}
} }
...@@ -44,8 +44,8 @@ var sigtable = [...]sigTabT{ ...@@ -44,8 +44,8 @@ var sigtable = [...]sigTabT{
/* 29 */ {_SigNotify, "SIGIO: i/o now possible"}, /* 29 */ {_SigNotify, "SIGIO: i/o now possible"},
/* 30 */ {_SigNotify, "SIGPWR: power failure restart"}, /* 30 */ {_SigNotify, "SIGPWR: power failure restart"},
/* 31 */ {_SigNotify, "SIGSYS: bad system call"}, /* 31 */ {_SigNotify, "SIGSYS: bad system call"},
/* 32 */ {_SigSetStack, "signal 32"}, /* SIGCANCEL; see issue 6997 */ /* 32 */ {_SigSetStack + _SigUnblock, "signal 32"}, /* SIGCANCEL; see issue 6997 */
/* 33 */ {_SigSetStack, "signal 33"}, /* SIGSETXID; see issue 3871, 9400 */ /* 33 */ {_SigSetStack + _SigUnblock, "signal 33"}, /* SIGSETXID; see issues 3871, 9400, 12498 */
/* 34 */ {_SigNotify, "signal 34"}, /* 34 */ {_SigNotify, "signal 34"},
/* 35 */ {_SigNotify, "signal 35"}, /* 35 */ {_SigNotify, "signal 35"},
/* 36 */ {_SigNotify, "signal 36"}, /* 36 */ {_SigNotify, "signal 36"},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment