aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/outcome/process.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/outcome/process.go')
-rw-r--r--internal/outcome/process.go22
1 files changed, 13 insertions, 9 deletions
diff --git a/internal/outcome/process.go b/internal/outcome/process.go
index 9b8fc537..44a62463 100644
--- a/internal/outcome/process.go
+++ b/internal/outcome/process.go
@@ -13,7 +13,6 @@ import (
"time"
"hakurei.app/check"
- "hakurei.app/container"
"hakurei.app/fhs"
"hakurei.app/hst"
"hakurei.app/internal/info"
@@ -372,17 +371,18 @@ func (k *outcome) start(ctx context.Context, msg message.Msg,
// shim runs in the same session as monitor; see shim.go for behaviour
cmd.Cancel = func() error { return cmd.Process.Signal(syscall.SIGCONT) }
- var shimPipe *os.File
- if fd, w, err := container.Setup(&cmd.ExtraFiles); err != nil {
+ var shimPipe [2]*os.File
+ if r, w, err := os.Pipe(); err != nil {
return cmd, nil, &hst.AppError{Step: "create shim setup pipe", Err: err}
} else {
- shimPipe = w
cmd.Env = []string{
// passed through to shim by hsu
- shimEnv + "=" + strconv.Itoa(fd),
+ shimEnv + "=" + strconv.Itoa(3+len(cmd.ExtraFiles)),
// interpreted by hsu
"HAKUREI_IDENTITY=" + k.state.identity.String(),
}
+ cmd.ExtraFiles = append(cmd.ExtraFiles, r)
+ shimPipe[0], shimPipe[1] = r, w
}
if len(k.supp) > 0 {
@@ -393,12 +393,16 @@ func (k *outcome) start(ctx context.Context, msg message.Msg,
msg.Verbosef("setuid helper at %s", hsuPath)
if err := cmd.Start(); err != nil {
+ _, _ = shimPipe[0].Close(), shimPipe[1].Close()
msg.Resume()
- return cmd, shimPipe, &hst.AppError{Step: "start setuid wrapper", Err: err}
+ return cmd, nil, &hst.AppError{Step: "start setuid wrapper", Err: err}
+ }
+ if err := shimPipe[0].Close(); err != nil {
+ msg.Verbose(err)
}
*startTime = time.Now().UTC()
- return cmd, shimPipe, nil
+ return cmd, shimPipe[1], nil
}
// serveShim serves outcomeState through the shim setup pipe.
@@ -411,11 +415,11 @@ func serveShim(msg message.Msg, shimPipe *os.File, state *outcomeState) error {
msg.Verbose(err.Error())
}
if err := gob.NewEncoder(shimPipe).Encode(state); err != nil {
+ _ = shimPipe.Close()
msg.Resume()
return &hst.AppError{Step: "transmit shim config", Err: err}
}
- _ = shimPipe.Close()
- return nil
+ return shimPipe.Close()
}
// printMessageError prints the error message according to [message.GetMessage],