73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package bwrap
|
|
|
|
import (
|
|
"os"
|
|
"slices"
|
|
|
|
"git.gensokyo.uk/security/fortify/helper/proc"
|
|
)
|
|
|
|
type Builder interface {
|
|
Len() int
|
|
Append(args *[]string)
|
|
}
|
|
|
|
type FSBuilder interface {
|
|
Path() string
|
|
Builder
|
|
}
|
|
|
|
type FDBuilder interface {
|
|
proc.File
|
|
Builder
|
|
}
|
|
|
|
// Args returns a slice of bwrap args corresponding to c.
|
|
func (c *Config) Args(syncFd *os.File, extraFiles *proc.ExtraFilesPre, files *[]proc.File) (args []string) {
|
|
builders := []Builder{
|
|
c.boolArgs(),
|
|
c.intArgs(),
|
|
c.stringArgs(),
|
|
c.pairArgs(),
|
|
c.seccompArgs(),
|
|
newFile(SyncFd.String(), syncFd),
|
|
}
|
|
|
|
builders = slices.Grow(builders, len(c.Filesystem)+1)
|
|
for _, f := range c.Filesystem {
|
|
builders = append(builders, f)
|
|
}
|
|
builders = append(builders, c.Chmod)
|
|
|
|
argc := 0
|
|
fc := 0
|
|
for _, b := range builders {
|
|
l := b.Len()
|
|
if l < 1 {
|
|
continue
|
|
}
|
|
argc += l
|
|
|
|
if f, ok := b.(FDBuilder); ok {
|
|
fc++
|
|
proc.InitFile(f, extraFiles)
|
|
}
|
|
}
|
|
fc++ // allocate extra slot for stat fd
|
|
|
|
args = make([]string, 0, argc)
|
|
*files = slices.Grow(*files, fc)
|
|
for _, b := range builders {
|
|
if b.Len() < 1 {
|
|
continue
|
|
}
|
|
b.Append(&args)
|
|
|
|
if f, ok := b.(FDBuilder); ok {
|
|
*files = append(*files, f)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|