From 1b9408864f7f575b83b8f822e7551772ccd37009 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 17 Mar 2025 22:36:39 +0900 Subject: [PATCH] sandbox: pass cmd to cancel function This is not usually in scope otherwise. Signed-off-by: Ophestra --- helper/container.go | 3 ++- sandbox/container.go | 9 +++++++-- sandbox/init.go | 3 +++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/helper/container.go b/helper/container.go index 33ab1e3..6872f55 100644 --- a/helper/container.go +++ b/helper/container.go @@ -5,6 +5,7 @@ import ( "errors" "io" "os" + "os/exec" "slices" "sync" @@ -61,7 +62,7 @@ func (h *helperContainer) Start() error { h.Env = append(h.Env, FortifyStatus+"=1") // stat is populated on fulfill - h.Cancel = func() error { return h.stat.Close() } + h.Cancel = func(*exec.Cmd) error { return h.stat.Close() } } else { h.Env = append(h.Env, FortifyStatus+"=0") } diff --git a/sandbox/container.go b/sandbox/container.go index 943c12c..f45e231 100644 --- a/sandbox/container.go +++ b/sandbox/container.go @@ -66,7 +66,7 @@ type ( Stdout io.Writer Stderr io.Writer - Cancel func() error + Cancel func(cmd *exec.Cmd) error WaitDelay time.Duration cmd *exec.Cmd @@ -143,7 +143,12 @@ func (p *Container) Start() error { } p.cmd.Stdin, p.cmd.Stdout, p.cmd.Stderr = p.Stdin, p.Stdout, p.Stderr - p.cmd.Cancel, p.cmd.WaitDelay = p.Cancel, p.WaitDelay + p.cmd.WaitDelay = p.WaitDelay + if p.Cancel != nil { + p.cmd.Cancel = func() error { return p.Cancel(p.cmd) } + } else { + p.cmd.Cancel = func() error { return p.cmd.Process.Signal(syscall.SIGTERM) } + } p.cmd.Dir = "/" p.cmd.SysProcAttr = &syscall.SysProcAttr{ Setsid: p.Flags&FAllowTTY == 0, diff --git a/sandbox/init.go b/sandbox/init.go index 5ebac81..05d6623 100644 --- a/sandbox/init.go +++ b/sandbox/init.go @@ -312,10 +312,13 @@ func Init(prepare func(prefix string), setVerbose func(verbose bool)) { switch { case w.wstatus.Exited(): r = w.wstatus.ExitStatus() + msg.Verbosef("initial process exited with code %d", w.wstatus.ExitStatus()) case w.wstatus.Signaled(): r = 128 + int(w.wstatus.Signal()) + msg.Verbosef("initial process exited with signal %s", w.wstatus.Signal()) default: r = 255 + msg.Verbosef("initial process exited with status %#x", w.wstatus) } go func() {