From a70daf22504f80c4e3dfbc2f34cf95db4dbb5879 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Fri, 21 Mar 2025 12:58:38 +0900 Subject: sandbox: resolve inverted flags in op Signed-off-by: Ophestra --- sandbox/mount.go | 74 ++++++-------------------------------------------------- 1 file changed, 7 insertions(+), 67 deletions(-) (limited to 'sandbox/mount.go') diff --git a/sandbox/mount.go b/sandbox/mount.go index dfe9f032..bb5d6135 100644 --- a/sandbox/mount.go +++ b/sandbox/mount.go @@ -1,82 +1,22 @@ package sandbox import ( - "errors" "fmt" "os" - "strings" "syscall" ) -const ( - BindOptional = 1 << iota - BindSource - BindWritable - BindDevice - - bindResolved - bindAbsolute - bindRecursive -) - -func bindMount(src, dest string, flags int) error { - target := toSysroot(dest) - var source string - - if flags&BindSource != 0 { - if flags&BindOptional != 0 { - return msg.WrapErr(syscall.EINVAL, - "flag source excludes optional") - } - } else if flags&bindResolved == 0 { - return msg.WrapErr(syscall.EBADE, - "flag source must be set on direct bind call") - } - - if flags&bindAbsolute != 0 { - if flags&BindSource == 0 { - return msg.WrapErr(syscall.EINVAL, - "flag absolute implies source") - } - source = src +func (p *procPaths) bindMount(source, target string, flags uintptr, eq bool) error { + var mf uintptr = syscall.MS_SILENT | syscall.MS_BIND + mf |= flags & syscall.MS_REC + if eq { + msg.Verbosef("resolved %q flags %#x", target, mf) } else { - source = toHost(src) + msg.Verbosef("resolved %q on %q flags %#x", source, target, mf) } - if fi, err := os.Stat(source); err != nil { - return msg.WrapErr(err, err.Error()) - } else if fi.IsDir() { - if err = os.MkdirAll(target, 0755); err != nil { - return msg.WrapErr(err, err.Error()) - } - } else if err = ensureFile(target, 0444); err != nil { - if errors.Is(err, syscall.EISDIR) { - return msg.WrapErr(err, - fmt.Sprintf("path %q is a directory", dest)) - } - return wrapErrSuffix(err, - fmt.Sprintf("cannot create %q:", dest)) - } - - var mf uintptr = syscall.MS_SILENT | syscall.MS_BIND - if flags&bindRecursive != 0 { - mf |= syscall.MS_REC - } - if flags&BindWritable == 0 { - mf |= syscall.MS_RDONLY - } - if flags&BindDevice == 0 { - mf |= syscall.MS_NODEV - } - if msg.IsVerbose() { - if strings.TrimPrefix(source, hostPath) == strings.TrimPrefix(target, sysrootPath) { - msg.Verbosef("resolved %q flags %#x", target, mf) - } else { - msg.Verbosef("resolved %q on %q flags %#x", source, target, mf) - } - } return wrapErrSuffix(syscall.Mount(source, target, "", mf, ""), - fmt.Sprintf("cannot bind %q on %q:", src, dest)) + fmt.Sprintf("cannot mount %q on %q:", source, target)) } func mountTmpfs(fsname, name string, size int, perm os.FileMode) error { -- cgit v1.3.1