mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
platform/ptrace: exit without panic if a stub process has been killed by SIGKILL
SIGKILL can be sent only by an user or OOM-killer. In both cases, we don't need to panic. PiperOrigin-RevId: 276150120
This commit is contained in:
@@ -327,6 +327,19 @@ func (t *thread) dumpAndPanic(message string) {
|
||||
panic(message)
|
||||
}
|
||||
|
||||
func (t *thread) unexpectedStubExit() {
|
||||
msg, err := t.getEventMessage()
|
||||
status := syscall.WaitStatus(msg)
|
||||
if status.Signaled() && status.Signal() == syscall.SIGKILL {
|
||||
// SIGKILL can be only sent by an user or OOM-killer. In both
|
||||
// these cases, we don't need to panic. There is no reasons to
|
||||
// think that something wrong in gVisor.
|
||||
log.Warningf("The ptrace stub process %v has been killed by SIGKILL.", t.tgid)
|
||||
syscall.Kill(os.Getpid(), syscall.SIGKILL)
|
||||
}
|
||||
t.dumpAndPanic(fmt.Sprintf("wait failed: the process %d:%d exited: %x (err %v)", t.tgid, t.tid, msg, err))
|
||||
}
|
||||
|
||||
// wait waits for a stop event.
|
||||
//
|
||||
// Precondition: outcome is a valid waitOutcome.
|
||||
@@ -355,8 +368,7 @@ func (t *thread) wait(outcome waitOutcome) syscall.Signal {
|
||||
}
|
||||
if stopSig == syscall.SIGTRAP {
|
||||
if status.TrapCause() == syscall.PTRACE_EVENT_EXIT {
|
||||
msg, err := t.getEventMessage()
|
||||
t.dumpAndPanic(fmt.Sprintf("wait failed: the process %d:%d exited: %x (err %v)", t.tgid, t.tid, msg, err))
|
||||
t.unexpectedStubExit()
|
||||
}
|
||||
// Re-encode the trap cause the way it's expected.
|
||||
return stopSig | syscall.Signal(status.TrapCause()<<8)
|
||||
|
||||
@@ -129,6 +129,9 @@ func createStub() (*thread, error) {
|
||||
// transitively) will be killed as well. It's simply not possible to
|
||||
// safely handle a single stub getting killed: the exact state of
|
||||
// execution is unknown and not recoverable.
|
||||
//
|
||||
// In addition, we set the PTRACE_O_TRACEEXIT option to log more
|
||||
// information about a stub process when it receives a fatal signal.
|
||||
return attachedThread(uintptr(syscall.SIGKILL)|syscall.CLONE_FILES, defaultAction)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user