aboutsummaryrefslogtreecommitdiffhomepage
path: root/container
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-23 00:16:46 +0900
committerOphestra <cat@gensokyo.uk>2025-08-23 00:16:46 +0900
commitea1e3ebae993a3d89302940dc1649b627c420aa1 (patch)
tree14bc57e3b04cde10394174c407c836d4ed25b113 /container
parent1c692bfb7926c0f28cf7f38ca7b49f4941fd2b90 (diff)
container/params: pass fd instead of file
The file is very difficult to stub. Pass fd instead as it is the value that is actually useful. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container')
-rw-r--r--container/dispatcher.go6
-rw-r--r--container/dispatcher_test.go4
-rw-r--r--container/init.go6
-rw-r--r--container/params.go6
-rw-r--r--container/params_test.go19
5 files changed, 19 insertions, 22 deletions
diff --git a/container/dispatcher.go b/container/dispatcher.go
index 86837b9d..78648a7f 100644
--- a/container/dispatcher.go
+++ b/container/dispatcher.go
@@ -45,7 +45,7 @@ type syscallDispatcher interface {
// isatty provides [Isatty].
isatty(fd int) bool
// receive provides [Receive].
- receive(key string, e any, v **os.File) (closeFunc func() error, err error)
+ receive(key string, e any, fdp *uintptr) (closeFunc func() error, err error)
// bindMount provides procPaths.bindMount.
bindMount(source, target string, flags uintptr, eq bool) error
@@ -152,8 +152,8 @@ func (direct) capBoundingSetDrop(cap uintptr) error { return capBound
func (direct) capAmbientClearAll() error { return capAmbientClearAll() }
func (direct) capAmbientRaise(cap uintptr) error { return capAmbientRaise(cap) }
func (direct) isatty(fd int) bool { return Isatty(fd) }
-func (direct) receive(key string, e any, v **os.File) (func() error, error) {
- return Receive(key, e, v)
+func (direct) receive(key string, e any, fdp *uintptr) (func() error, error) {
+ return Receive(key, e, fdp)
}
func (direct) bindMount(source, target string, flags uintptr, eq bool) error {
diff --git a/container/dispatcher_test.go b/container/dispatcher_test.go
index 1152e167..012673aa 100644
--- a/container/dispatcher_test.go
+++ b/container/dispatcher_test.go
@@ -356,12 +356,12 @@ func (k *kstub) isatty(fd int) bool {
return expect.ret.(bool)
}
-func (k *kstub) receive(key string, e any, v **os.File) (closeFunc func() error, err error) {
+func (k *kstub) receive(key string, e any, fdp *uintptr) (closeFunc func() error, err error) {
expect := k.expect("receive")
return expect.ret.(func() error), expect.error(
checkArg(k, "key", key, 0),
checkArgReflect(k, "e", e, 1),
- checkArg(k, "v", v, 2))
+ checkArg(k, "fdp", fdp, 2))
}
func (k *kstub) bindMount(source, target string, flags uintptr, eq bool) error {
diff --git a/container/init.go b/container/init.go
index 2139ccc3..813b4ac5 100644
--- a/container/init.go
+++ b/container/init.go
@@ -99,10 +99,10 @@ func initEntrypoint(k syscallDispatcher, prepareLogger func(prefix string), setV
var (
params initParams
closeSetup func() error
- setupFile *os.File
+ setupFd uintptr
offsetSetup int
)
- if f, err := k.receive(setupEnv, &params, &setupFile); err != nil {
+ if f, err := k.receive(setupEnv, &params, &setupFd); err != nil {
if errors.Is(err, EBADF) {
k.fatal("invalid setup descriptor")
}
@@ -122,7 +122,7 @@ func initEntrypoint(k syscallDispatcher, prepareLogger func(prefix string), setV
setVerbose(params.Verbose)
k.verbose("received setup parameters")
closeSetup = f
- offsetSetup = int(setupFile.Fd() + 1)
+ offsetSetup = int(setupFd + 1)
}
// write uid/gid map here so parent does not need to set dumpable
diff --git a/container/params.go b/container/params.go
index 09be3707..00c98cf8 100644
--- a/container/params.go
+++ b/container/params.go
@@ -25,7 +25,7 @@ func Setup(extraFiles *[]*os.File) (int, *gob.Encoder, error) {
}
// Receive retrieves setup fd from the environment and receives params.
-func Receive(key string, e any, v **os.File) (func() error, error) {
+func Receive(key string, e any, fdp *uintptr) (func() error, error) {
var setup *os.File
if s, ok := os.LookupEnv(key); !ok {
@@ -38,8 +38,8 @@ func Receive(key string, e any, v **os.File) (func() error, error) {
if setup == nil {
return nil, syscall.EBADF
}
- if v != nil {
- *v = setup
+ if fdp != nil {
+ *fdp = setup.Fd()
}
}
}
diff --git a/container/params_test.go b/container/params_test.go
index 537d6867..720f0bf4 100644
--- a/container/params_test.go
+++ b/container/params_test.go
@@ -53,7 +53,7 @@ func TestSetupReceive(t *testing.T) {
})
t.Run("setup receive", func(t *testing.T) {
- check := func(t *testing.T, useNilFp bool) {
+ check := func(t *testing.T, useNilFdp bool) {
const key = "TEST_SETUP_RECEIVE"
payload := []int{syscall.MS_MGC_VAL, syscall.MS_MGC_MSK, syscall.MS_ASYNC, syscall.MS_ACTIVE}
@@ -82,13 +82,13 @@ func TestSetupReceive(t *testing.T) {
var (
gotPayload []int
- fp **os.File
+ fdp *uintptr
)
- if !useNilFp {
- fp = new(*os.File)
+ if !useNilFdp {
+ fdp = new(uintptr)
}
var closeFile func() error
- if f, err := container.Receive(key, &gotPayload, fp); err != nil {
+ if f, err := container.Receive(key, &gotPayload, fdp); err != nil {
t.Fatalf("Receive: error = %v", err)
} else {
closeFile = f
@@ -97,12 +97,9 @@ func TestSetupReceive(t *testing.T) {
t.Errorf("Receive: %#v, want %#v", gotPayload, payload)
}
}
- if !useNilFp {
- if name := (*fp).Name(); name != "setup" {
- t.Errorf("Name: %s, want setup", name)
- }
- if fd := int((*fp).Fd()); fd != dupFd {
- t.Errorf("Fd: %d, want %d", fd, dupFd)
+ if !useNilFdp {
+ if int(*fdp) != dupFd {
+ t.Errorf("Fd: %d, want %d", *fdp, dupFd)
}
}