]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: ignore sigaction error on Linux if it is for SIGRTMAX
authorAlberto Donizetti <alb.donizetti@gmail.com>
Thu, 3 May 2018 08:13:31 +0000 (10:13 +0200)
committerAlberto Donizetti <alb.donizetti@gmail.com>
Fri, 4 May 2018 18:46:33 +0000 (18:46 +0000)
The Go runtime registers a handler for every signal. This prevents Go
binaries from working on QEMU in user-emulation mode, since the hacky
way QEMU implements signals on Linux assumes that no-one uses signal
64 (SIGRTMAX).

In the past, we had a workaround in the runtime to prevent crashes on
start-up when running on QEMU:

  golang.org/cl/124900043
  golang.org/cl/16853

but it went lost during the 1.11 dev cycle. More precisely, the test
for SIGRTMAX was dropped in CL 18150 when we stopped testing the
result of sigaction in the Linux implementation of setsig. That change
was made to avoid a stack split overflow because code started calling
setsig from nosplit functions. Then in CL 99077 we started testing the
result of sigaction again, this time using systemstack to avoid to
stack split overflow. When this test was added back, we did not bring
back the test of SIGRTMAX.

As a result, Go1.10 binaries work on QEMU, while 1.11 binaries
immediately crash on startup.

This change restores the QEMU workaround.

Updates #24656

Change-Id: I46380b1e1b4bf47db7bc7b3d313f00c4e4c11ea3
Reviewed-on: https://go-review.googlesource.com/111176
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/os_linux.go

index a4992343b5d5e24b546d9766fe29907f9d9cbb13..68f99de115d4387d6042dc1cf6e0a90022c0267b 100644 (file)
@@ -415,10 +415,14 @@ func (c *sigctxt) fixsigcode(sig uint32) {
 //go:nosplit
 func sysSigaction(sig uint32, new, old *sigactiont) {
        if rt_sigaction(uintptr(sig), new, old, unsafe.Sizeof(sigactiont{}.sa_mask)) != 0 {
-               // Use system stack to avoid split stack overflow on ppc64/ppc64le.
-               systemstack(func() {
-                       throw("sigaction failed")
-               })
+               // Workaround for bug in Qemu user mode emulation. (qemu
+               // rejects rt_sigaction of signal 64, SIGRTMAX).
+               if sig != 64 {
+                       // Use system stack to avoid split stack overflow on ppc64/ppc64le.
+                       systemstack(func() {
+                               throw("sigaction failed")
+                       })
+               }
        }
 }