Переглянути джерело

Merge pull request #42397 from thaJeztah/catch_almost_all

pkg/signal.CatchAll: ignore SIGURG on Linux
Sebastiaan van Stijn 4 роки тому
батько
коміт
354b9bddb3

+ 7 - 0
pkg/signal/signal.go

@@ -12,9 +12,16 @@ import (
 )
 )
 
 
 // CatchAll catches all signals and relays them to the specified channel.
 // CatchAll catches all signals and relays them to the specified channel.
+// On Linux, SIGURG is not handled, as it's used by the Go runtime to support
+// preemptable system calls.
 func CatchAll(sigc chan os.Signal) {
 func CatchAll(sigc chan os.Signal) {
 	var handledSigs []os.Signal
 	var handledSigs []os.Signal
 	for _, s := range SignalMap {
 	for _, s := range SignalMap {
+		if isRuntimeSig(s) {
+			// Do not handle SIGURG on Linux, as in go1.14+, the go runtime issues
+			// SIGURG as an interrupt to support preemptable system calls on Linux.
+			continue
+		}
 		handledSigs = append(handledSigs, s)
 		handledSigs = append(handledSigs, s)
 	}
 	}
 	signal.Notify(sigc, handledSigs...)
 	signal.Notify(sigc, handledSigs...)

+ 5 - 0
pkg/signal/signal_darwin.go

@@ -1,6 +1,7 @@
 package signal // import "github.com/docker/docker/pkg/signal"
 package signal // import "github.com/docker/docker/pkg/signal"
 
 
 import (
 import (
+	"os"
 	"syscall"
 	"syscall"
 )
 )
 
 
@@ -39,3 +40,7 @@ var SignalMap = map[string]syscall.Signal{
 	"XCPU":   syscall.SIGXCPU,
 	"XCPU":   syscall.SIGXCPU,
 	"XFSZ":   syscall.SIGXFSZ,
 	"XFSZ":   syscall.SIGXFSZ,
 }
 }
+
+func isRuntimeSig(_ os.Signal) bool {
+	return false
+}

+ 5 - 0
pkg/signal/signal_freebsd.go

@@ -1,6 +1,7 @@
 package signal // import "github.com/docker/docker/pkg/signal"
 package signal // import "github.com/docker/docker/pkg/signal"
 
 
 import (
 import (
+	"os"
 	"syscall"
 	"syscall"
 )
 )
 
 
@@ -41,3 +42,7 @@ var SignalMap = map[string]syscall.Signal{
 	"XCPU":   syscall.SIGXCPU,
 	"XCPU":   syscall.SIGXCPU,
 	"XFSZ":   syscall.SIGXFSZ,
 	"XFSZ":   syscall.SIGXFSZ,
 }
 }
+
+func isRuntimeSig(_ os.Signal) bool {
+	return false
+}

+ 5 - 0
pkg/signal/signal_linux.go

@@ -3,6 +3,7 @@
 package signal // import "github.com/docker/docker/pkg/signal"
 package signal // import "github.com/docker/docker/pkg/signal"
 
 
 import (
 import (
+	"os"
 	"syscall"
 	"syscall"
 
 
 	"golang.org/x/sys/unix"
 	"golang.org/x/sys/unix"
@@ -81,3 +82,7 @@ var SignalMap = map[string]syscall.Signal{
 	"RTMAX-1":  sigrtmax - 1,
 	"RTMAX-1":  sigrtmax - 1,
 	"RTMAX":    sigrtmax,
 	"RTMAX":    sigrtmax,
 }
 }
+
+func isRuntimeSig(s os.Signal) bool {
+	return s == unix.SIGURG
+}

+ 5 - 0
pkg/signal/signal_linux_mipsx.go

@@ -4,6 +4,7 @@
 package signal // import "github.com/docker/docker/pkg/signal"
 package signal // import "github.com/docker/docker/pkg/signal"
 
 
 import (
 import (
+	"os"
 	"syscall"
 	"syscall"
 
 
 	"golang.org/x/sys/unix"
 	"golang.org/x/sys/unix"
@@ -82,3 +83,7 @@ var SignalMap = map[string]syscall.Signal{
 	"RTMAX-1":  sigrtmax - 1,
 	"RTMAX-1":  sigrtmax - 1,
 	"RTMAX":    sigrtmax,
 	"RTMAX":    sigrtmax,
 }
 }
+
+func isRuntimeSig(s os.Signal) bool {
+	return s == unix.SIGURG
+}

+ 17 - 0
pkg/signal/signal_linux_test.go

@@ -6,6 +6,7 @@ import (
 	"os"
 	"os"
 	"syscall"
 	"syscall"
 	"testing"
 	"testing"
+	"time"
 
 
 	"gotest.tools/v3/assert"
 	"gotest.tools/v3/assert"
 	is "gotest.tools/v3/assert/cmp"
 	is "gotest.tools/v3/assert/cmp"
@@ -34,6 +35,22 @@ func TestCatchAll(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestCatchAllIgnoreSigUrg(t *testing.T) {
+	sigs := make(chan os.Signal, 1)
+	CatchAll(sigs)
+	defer StopCatch(sigs)
+
+	err := syscall.Kill(syscall.Getpid(), syscall.SIGURG)
+	assert.NilError(t, err)
+	timer := time.NewTimer(1 * time.Second)
+	defer timer.Stop()
+	select {
+	case <-timer.C:
+	case s := <-sigs:
+		t.Fatalf("expected no signals to be handled, but received %q", s.String())
+	}
+}
+
 func TestStopCatch(t *testing.T) {
 func TestStopCatch(t *testing.T) {
 	signal := SignalMap["HUP"]
 	signal := SignalMap["HUP"]
 	channel := make(chan os.Signal, 1)
 	channel := make(chan os.Signal, 1)

+ 5 - 0
pkg/signal/signal_windows.go

@@ -1,6 +1,7 @@
 package signal // import "github.com/docker/docker/pkg/signal"
 package signal // import "github.com/docker/docker/pkg/signal"
 
 
 import (
 import (
+	"os"
 	"syscall"
 	"syscall"
 )
 )
 
 
@@ -24,3 +25,7 @@ var SignalMap = map[string]syscall.Signal{
 	"KILL": syscall.SIGKILL,
 	"KILL": syscall.SIGKILL,
 	"TERM": syscall.SIGTERM,
 	"TERM": syscall.SIGTERM,
 }
 }
+
+func isRuntimeSig(_ os.Signal) bool {
+	return false
+}