mirror of
https://github.com/golang/go
synced 2024-11-18 06:54:49 -07:00
ffd7d31787
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/14297 Reviewed-by: David Crawshaw <crawshaw@golang.org>
50 lines
848 B
Go
50 lines
848 B
Go
// Copyright 2012 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.
|
|
|
|
// Test that setgid does not hang on GNU/Linux.
|
|
// See https://golang.org/issue/3871 for details.
|
|
|
|
package cgotest
|
|
|
|
/*
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func runTestSetgid() bool {
|
|
c := make(chan bool)
|
|
go func() {
|
|
C.setgid(0)
|
|
c <- true
|
|
}()
|
|
select {
|
|
case <-c:
|
|
return true
|
|
case <-time.After(5 * time.Second):
|
|
return false
|
|
}
|
|
|
|
}
|
|
|
|
func testSetgid(t *testing.T) {
|
|
if !runTestSetgid() {
|
|
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")
|
|
}
|
|
}
|