diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-01-22 01:51:10 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-01-22 01:52:57 +0900 |
| commit | 9a239fa1a5ad2ff248ca7a9d39342f66926c9fef (patch) | |
| tree | 09efadb2ddf4eaeaf153d7e4b7d73e1b20d2fc1a /helper/bwrap/arg.go | |
| parent | 82029948e6d8d047edc02ccff354e16c419e5742 (diff) | |
helper/bwrap: integrate seccomp into helper interface
This makes API usage much cleaner, and encapsulates all bwrap arguments in argsWt.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper/bwrap/arg.go')
| -rw-r--r-- | helper/bwrap/arg.go | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/helper/bwrap/arg.go b/helper/bwrap/arg.go index efdab823..d419ba50 100644 --- a/helper/bwrap/arg.go +++ b/helper/bwrap/arg.go @@ -1,6 +1,13 @@ package bwrap -import "encoding/gob" +import ( + "encoding/gob" + "os" + "slices" + "strconv" + + "git.gensokyo.uk/security/fortify/internal/proc" +) type Builder interface { Len() int @@ -12,6 +19,11 @@ type FSBuilder interface { Builder } +type FDBuilder interface { + Len() int + Append(args *[]string, extraFiles *[]*os.File) error +} + func init() { gob.Register(new(pairF)) gob.Register(new(stringF)) @@ -45,6 +57,33 @@ func (s stringF) Append(args *[]string) { *args = append(*args, s[0], s[1]) } +type fileF struct { + name string + file *os.File +} + +func (f *fileF) Len() int { + if f.file == nil { + return 0 + } + return 2 +} + +func (f *fileF) Append(args *[]string, extraFiles *[]*os.File) error { + if f.file == nil { + return nil + } + extraFile(args, extraFiles, f.name, f.file) + return nil +} + +func extraFile(args *[]string, extraFiles *[]*os.File, name string, f *os.File) { + if f == nil { + return + } + *args = append(*args, name, strconv.Itoa(int(proc.ExtraFileSlice(extraFiles, f)))) +} + // Args returns a slice of bwrap args corresponding to c. func (c *Config) Args() (args []string) { builders := []Builder{ @@ -75,3 +114,25 @@ func (c *Config) Args() (args []string) { return } + +func (c *Config) FDArgs(syncFd *os.File, extraFiles *[]*os.File) (args []string, err error) { + builders := []FDBuilder{ + &seccompBuilder{c}, + &fileF{positionalArgs[SyncFd], syncFd}, + } + + argc := 0 + for _, b := range builders { + argc += b.Len() + } + + args = make([]string, 0, argc) + *extraFiles = slices.Grow(*extraFiles, len(builders)) + + for _, b := range builders { + if err = b.Append(&args, extraFiles); err != nil { + break + } + } + return +} |
