Compare commits

..

2 Commits

Author SHA1 Message Date
d0d6f192ad
container: optionally isolate host abstract UNIX domain sockets via landlock
Some checks failed
Test / Hakurei (race detector) (push) Failing after 1m46s
Test / Sandbox (pull_request) Failing after 1m58s
Test / Hakurei (race detector) (pull_request) Failing after 4m51s
Test / Hpkg (pull_request) Failing after 2m18s
Test / Flake checks (pull_request) Has been skipped
Test / Sandbox (race detector) (push) Failing after 2m48s
Test / Hpkg (push) Failing after 2m49s
Test / Flake checks (push) Has been skipped
Test / Create distribution (push) Failing after 32s
Test / Create distribution (pull_request) Failing after 34s
Test / Hakurei (push) Failing after 1m4s
Test / Sandbox (race detector) (pull_request) Failing after 3m45s
Test / Sandbox (push) Failing after 1m22s
Test / Hakurei (pull_request) Failing after 1m38s
2025-08-17 17:34:12 +09:00
0ba993ec39
container: start from locked thread
Some checks failed
Test / Create distribution (push) Successful in 33s
Test / Hakurei (push) Failing after 1m1s
Test / Sandbox (race detector) (push) Failing after 1m41s
Test / Hakurei (race detector) (push) Failing after 2m42s
Test / Sandbox (push) Failing after 1m19s
Test / Hpkg (push) Failing after 1m39s
Test / Flake checks (push) Has been skipped
This allows setup that relies on per-thread state like securebits and landlock, from the parent side.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-08-17 17:26:20 +09:00

View File

@ -9,6 +9,7 @@ import (
"io"
"os"
"os/exec"
"runtime"
"strconv"
. "syscall"
"time"
@ -36,6 +37,8 @@ type (
setup *gob.Encoder
// cancels cmd
cancel context.CancelFunc
// closed after Wait returns
wait chan struct{}
Stdin io.Reader
Stdout io.Writer
@ -172,11 +175,23 @@ func (p *Container) Start() error {
}
p.cmd.ExtraFiles = append(p.cmd.ExtraFiles, p.ExtraFiles...)
msg.Verbose("starting container init")
if err := p.cmd.Start(); err != nil {
return msg.WrapErr(err, err.Error())
}
return nil
done := make(chan error, 1)
go func() {
runtime.LockOSThread()
p.wait = make(chan struct{})
done <- func() error { // setup depending on per-thread state must happen here
msg.Verbose("starting container init")
if err := p.cmd.Start(); err != nil {
return msg.WrapErr(err, err.Error())
}
return nil
}()
// keep this thread alive until Wait returns for cancel
<-p.wait
}()
return <-done
}
// Serve serves [Container.Params] to the container init.
@ -217,8 +232,14 @@ func (p *Container) Serve() error {
return err
}
// Wait waits for the container init process to exit.
func (p *Container) Wait() error { defer p.cancel(); return p.cmd.Wait() }
// Wait waits for the container init process to exit and releases any resources associated with the [Container].
func (p *Container) Wait() error {
if p.wait == nil {
return EINVAL
}
defer func() { close(p.wait); p.cancel(); p.wait = nil }()
return p.cmd.Wait()
}
func (p *Container) String() string {
return fmt.Sprintf("argv: %q, filter: %v, rules: %d, flags: %#x, presets: %#x",