summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/sentry/kernel/kernel.go7
-rw-r--r--pkg/sentry/kernel/signal.go13
-rw-r--r--pkg/sentry/sighandling/sighandling.go14
3 files changed, 19 insertions, 15 deletions
diff --git a/pkg/sentry/kernel/kernel.go b/pkg/sentry/kernel/kernel.go
index a17148af1..5662b8f08 100644
--- a/pkg/sentry/kernel/kernel.go
+++ b/pkg/sentry/kernel/kernel.go
@@ -760,12 +760,11 @@ func (k *Kernel) Unpause() {
//
// context is used only for debugging to describe how the signal was received.
//
-// Returns false if signal could not be sent because the Kernel is not fully
-// initialized yet.
-func (k *Kernel) SendExternalSignal(info *arch.SignalInfo, context string) bool {
+// Preconditions: Kernel must have an init process.
+func (k *Kernel) SendExternalSignal(info *arch.SignalInfo, context string) {
k.extMu.Lock()
defer k.extMu.Unlock()
- return k.sendExternalSignal(info, context)
+ k.sendExternalSignal(info, context)
}
// FeatureSet returns the FeatureSet.
diff --git a/pkg/sentry/kernel/signal.go b/pkg/sentry/kernel/signal.go
index 8edd05cdf..e3a2a777a 100644
--- a/pkg/sentry/kernel/signal.go
+++ b/pkg/sentry/kernel/signal.go
@@ -15,6 +15,8 @@
package kernel
import (
+ "fmt"
+
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
"gvisor.googlesource.com/gvisor/pkg/log"
"gvisor.googlesource.com/gvisor/pkg/sentry/arch"
@@ -33,13 +35,11 @@ const SignalPanic = linux.SIGUSR2
//
// context is used only for debugging to differentiate these cases.
//
-// Returns false if signal could not be sent because the Kernel is not fully
-// initialized yet.
-func (k *Kernel) sendExternalSignal(info *arch.SignalInfo, context string) bool {
+// Preconditions: Kernel must have an init process.
+func (k *Kernel) sendExternalSignal(info *arch.SignalInfo, context string) {
switch linux.Signal(info.Signo) {
case platform.SignalInterrupt:
// Assume that a call to platform.Context.Interrupt() misfired.
- return true
case SignalPanic:
// SignalPanic is also specially handled in sentry setup to ensure that
@@ -50,13 +50,10 @@ func (k *Kernel) sendExternalSignal(info *arch.SignalInfo, context string) bool
default:
log.Infof("Received external signal %d in %s context", info.Signo, context)
if k.globalInit == nil {
- log.Warningf("Received external signal %d before init created", info.Signo)
- return false
+ panic(fmt.Sprintf("Received external signal %d before init created", info.Signo))
}
k.globalInit.SendSignal(info)
}
-
- return true
}
// sigPriv returns a SignalInfo representing a signal sent by the sentry. (The
diff --git a/pkg/sentry/sighandling/sighandling.go b/pkg/sentry/sighandling/sighandling.go
index ef6f7f617..25295440c 100644
--- a/pkg/sentry/sighandling/sighandling.go
+++ b/pkg/sentry/sighandling/sighandling.go
@@ -16,6 +16,7 @@
package sighandling
import (
+ "fmt"
"os"
"os/signal"
"reflect"
@@ -65,7 +66,9 @@ func forwardSignals(k *kernel.Kernel, sigchans []chan os.Signal, start, stop cha
// Otherwise, it was a signal on channel N. Index 0 represents the stop
// channel, so index N represents the channel for signal N.
- if !started || !k.SendExternalSignal(&arch.SignalInfo{Signo: int32(index)}, "sentry") {
+ signal := linux.Signal(index)
+
+ if !started {
// Kernel is not ready to receive signals.
//
// Kill ourselves if this signal would have killed the
@@ -78,11 +81,16 @@ func forwardSignals(k *kernel.Kernel, sigchans []chan os.Signal, start, stop cha
// TODO: Convert Go's runtime.raise from
// tkill to tgkill so PrepareForwarding doesn't need to
// be called until after filter installation.
- switch linux.Signal(index) {
+ switch signal {
case linux.SIGHUP, linux.SIGINT, linux.SIGTERM:
- dieFromSignal(linux.Signal(index))
+ dieFromSignal(signal)
+ panic(fmt.Sprintf("Failed to die from signal %d", signal))
+ default:
+ continue
}
}
+
+ k.SendExternalSignal(&arch.SignalInfo{Signo: int32(signal)}, "sentry")
}
// Close all individual channels.