From 5af2be8604168dd7d11c2e3ddc09b571809837e4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 18 Nov 2015 17:18:08 +0000 Subject: [PATCH] Revert "runtime: use a proper type, sigset, for m.sigmask" This reverts commit 7db77271e423604c3b58b4c4da60ddc3c3eecc0d. Change-Id: I6d8855eb05ca331025dc49a5533c6da4d1fa4e84 Reviewed-on: https://go-review.googlesource.com/17030 Reviewed-by: Russ Cox --- src/runtime/os1_darwin.go | 24 +++++++++++++----------- src/runtime/os1_dragonfly.go | 11 ++++++++--- src/runtime/os1_freebsd.go | 11 ++++++++--- src/runtime/os1_linux.go | 9 ++++++--- src/runtime/os1_nacl.go | 2 -- src/runtime/os1_netbsd.go | 11 ++++++++--- src/runtime/os1_openbsd.go | 23 +++++++++++++---------- src/runtime/os1_plan9.go | 2 -- src/runtime/os1_windows.go | 2 -- src/runtime/os3_solaris.go | 11 ++++++++--- src/runtime/os_darwin.go | 2 +- src/runtime/os_openbsd.go | 2 +- src/runtime/runtime2.go | 2 +- 13 files changed, 67 insertions(+), 45 deletions(-) diff --git a/src/runtime/os1_darwin.go b/src/runtime/os1_darwin.go index e702739508..ba38a78ed1 100644 --- a/src/runtime/os1_darwin.go +++ b/src/runtime/os1_darwin.go @@ -8,9 +8,7 @@ import "unsafe" //extern SigTabTT runtime·sigtab[]; -type sigset uint32 - -var sigset_all = ^sigset(0) +var sigset_all = ^uint32(0) func unimplemented(name string) { println(name, "not implemented") @@ -85,7 +83,7 @@ func newosproc(mp *m, stk unsafe.Pointer) { print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n") } - var oset sigset + var oset uint32 sigprocmask(_SIG_SETMASK, &sigset_all, &oset) errno := bsdthread_create(stk, unsafe.Pointer(mp), funcPC(mstart)) sigprocmask(_SIG_SETMASK, &oset, nil) @@ -111,7 +109,7 @@ func newosproc0(stacksize uintptr, fn unsafe.Pointer, fnarg uintptr) { } stk := unsafe.Pointer(uintptr(stack) + stacksize) - var oset sigset + var oset uint32 sigprocmask(_SIG_SETMASK, &sigset_all, &oset) errno := bsdthread_create(stk, fn, fnarg) sigprocmask(_SIG_SETMASK, &oset, nil) @@ -133,7 +131,11 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) + smask := (*uint32)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + sigprocmask(_SIG_SETMASK, nil, smask) } // Called to initialize a new m (including the bootstrap m). @@ -144,7 +146,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask &^= 1 << (uint32(i) - 1) @@ -156,7 +158,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil) + smask := (*uint32)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask, nil) signalstack(nil) } @@ -469,11 +472,10 @@ func signalstack(s *stack) { } func updatesigmask(m sigmask) { - s := sigset(m[0]) - sigprocmask(_SIG_SETMASK, &s, nil) + sigprocmask(_SIG_SETMASK, &m[0], nil) } func unblocksig(sig int32) { - mask := sigset(1) << (uint32(sig) - 1) + mask := uint32(1) << (uint32(sig) - 1) sigprocmask(_SIG_UNBLOCK, &mask, nil) } diff --git a/src/runtime/os1_dragonfly.go b/src/runtime/os1_dragonfly.go index 916a89e92f..a1be981f56 100644 --- a/src/runtime/os1_dragonfly.go +++ b/src/runtime/os1_dragonfly.go @@ -118,7 +118,11 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) + smask := (*sigset)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + sigprocmask(_SIG_SETMASK, nil, smask) } // Called to initialize a new m (including the bootstrap m). @@ -133,7 +137,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) @@ -145,7 +149,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil) + smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask, nil) signalstack(nil) } diff --git a/src/runtime/os1_freebsd.go b/src/runtime/os1_freebsd.go index 9f6f8407a6..a325620fe6 100644 --- a/src/runtime/os1_freebsd.go +++ b/src/runtime/os1_freebsd.go @@ -121,7 +121,11 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) + smask := (*sigset)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + sigprocmask(_SIG_SETMASK, nil, smask) } // Called to initialize a new m (including the bootstrap m). @@ -139,7 +143,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) @@ -151,7 +155,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil) + smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask, nil) signalstack(nil) } diff --git a/src/runtime/os1_linux.go b/src/runtime/os1_linux.go index 5977b8437f..8b5cdd3465 100644 --- a/src/runtime/os1_linux.go +++ b/src/runtime/os1_linux.go @@ -198,7 +198,10 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - smask := &mp.sigmask + smask := (*sigset)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } rtsigprocmask(_SIG_SETMASK, nil, smask, int32(unsafe.Sizeof(*smask))) } @@ -215,7 +218,7 @@ func minit() { _g_.m.procid = uint64(gettid()) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { sigdelset(&nmask, i) @@ -227,7 +230,7 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - smask := &_g_.m.sigmask + smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask)) rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask))) signalstack(nil) } diff --git a/src/runtime/os1_nacl.go b/src/runtime/os1_nacl.go index 3e98261601..ad4329cecd 100644 --- a/src/runtime/os1_nacl.go +++ b/src/runtime/os1_nacl.go @@ -6,8 +6,6 @@ package runtime import "unsafe" -type sigset struct{} - // Called to initialize a new m (including the bootstrap m). // Called on the parent thread (main thread in case of bootstrap), can allocate memory. func mpreinit(mp *m) { diff --git a/src/runtime/os1_netbsd.go b/src/runtime/os1_netbsd.go index 3e19115a85..3e77d248f7 100644 --- a/src/runtime/os1_netbsd.go +++ b/src/runtime/os1_netbsd.go @@ -139,7 +139,11 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) + smask := (*sigset)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + sigprocmask(_SIG_SETMASK, nil, smask) } // Called to initialize a new m (including the bootstrap m). @@ -152,7 +156,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) @@ -164,7 +168,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil) + smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask, nil) signalstack(nil) } diff --git a/src/runtime/os1_openbsd.go b/src/runtime/os1_openbsd.go index 8c770a72d0..11034a64f6 100644 --- a/src/runtime/os1_openbsd.go +++ b/src/runtime/os1_openbsd.go @@ -22,11 +22,9 @@ const ( _CLOCK_MONOTONIC = 3 ) -type sigset uint32 - const ( - sigset_none = sigset(0) - sigset_all = ^sigset(0) + sigset_none = uint32(0) + sigset_all = ^uint32(0) ) // From OpenBSD's @@ -151,7 +149,11 @@ func mpreinit(mp *m) { } func msigsave(mp *m) { - mp.sigmask = sigprocmask(_SIG_BLOCK, 0) + smask := (*uint32)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + *smask = sigprocmask(_SIG_BLOCK, 0) } // Called to initialize a new m (including the bootstrap m). @@ -166,7 +168,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask &^= 1 << (uint32(i) - 1) @@ -178,7 +180,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, _g_.m.sigmask) + smask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask) signalstack(nil) } @@ -200,7 +203,7 @@ func setsig(i int32, fn uintptr, restart bool) { if restart { sa.sa_flags |= _SA_RESTART } - sa.sa_mask = uint32(sigset_all) + sa.sa_mask = sigset_all if fn == funcPC(sighandler) { fn = funcPC(sigtramp) } @@ -234,10 +237,10 @@ func signalstack(s *stack) { } func updatesigmask(m sigmask) { - sigprocmask(_SIG_SETMASK, sigset(m[0])) + sigprocmask(_SIG_SETMASK, m[0]) } func unblocksig(sig int32) { - mask := sigset(1) << (uint32(sig) - 1) + mask := uint32(1) << (uint32(sig) - 1) sigprocmask(_SIG_UNBLOCK, mask) } diff --git a/src/runtime/os1_plan9.go b/src/runtime/os1_plan9.go index 06329da88e..bc7ce65daf 100644 --- a/src/runtime/os1_plan9.go +++ b/src/runtime/os1_plan9.go @@ -9,8 +9,6 @@ import ( "unsafe" ) -type sigset struct{} - // Called to initialize a new m (including the bootstrap m). // Called on the parent thread (main thread in case of bootstrap), can allocate memory. func mpreinit(mp *m) { diff --git a/src/runtime/os1_windows.go b/src/runtime/os1_windows.go index db1b8e4937..8134543578 100644 --- a/src/runtime/os1_windows.go +++ b/src/runtime/os1_windows.go @@ -99,8 +99,6 @@ var ( _GetQueuedCompletionStatusEx stdFunction ) -type sigset struct{} - // Call a Windows function with stdcall conventions, // and switch to os stack during the call. func asmstdcall(fn unsafe.Pointer) diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index c92722b7a2..3ac121a7b8 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -193,7 +193,11 @@ func mpreinit(mp *m) { func miniterrno() func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) + smask := (*sigset)(unsafe.Pointer(&mp.sigmask)) + if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) { + throw("insufficient storage for signal mask") + } + sigprocmask(_SIG_SETMASK, nil, smask) } // Called to initialize a new m (including the bootstrap m). @@ -205,7 +209,7 @@ func minit() { signalstack(&_g_.m.gsignal.stack) // restore signal mask from m.sigmask and unblock essential signals - nmask := _g_.m.sigmask + nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask)) for i := range sigtable { if sigtable[i].flags&_SigUnblock != 0 { nmask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) @@ -217,7 +221,8 @@ func minit() { // Called from dropm to undo the effect of an minit. func unminit() { _g_ := getg() - sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil) + smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask)) + sigprocmask(_SIG_SETMASK, smask, nil) signalstack(nil) } diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 75a6eebb70..7a70639b02 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -24,7 +24,7 @@ func mach_thread_self() uint32 func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 //go:noescape -func sigprocmask(how uint32, new, old *sigset) +func sigprocmask(how uint32, new, old *uint32) //go:noescape func sigaction(mode uint32, new, old *sigactiont) diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index b6285e4972..12f4cd1a24 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -18,7 +18,7 @@ func sigaction(sig int32, new, old *sigactiont) func sigaltstack(new, old *stackt) //go:noescape -func sigprocmask(mode int32, new sigset) sigset +func sigprocmask(mode int32, new uint32) uint32 //go:noescape func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 9e91832370..eb7b30a344 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -273,7 +273,7 @@ type m struct { // Fields not known to debuggers. procid uint64 // for debuggers, but offset not hard-coded gsignal *g // signal-handling g - sigmask sigset // storage for saved signal mask + sigmask [4]uintptr // storage for saved signal mask tls [6]uintptr // thread-local storage (for x86 extern register) mstartfn func() curg *g // current running goroutine -- 2.48.1