diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-03-17 02:31:46 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-03-17 02:44:07 +0900 |
| commit | 9a1f8e129fe0f9919981b8a1d345a9b455bd76de (patch) | |
| tree | e52f33a3908c256aebb30f059cabd40f371a886f /internal/sandbox/init.go | |
| parent | ee108603572101ad3c285830e04ee248916b6c5d (diff) | |
sandbox: wrap fmsg interface
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/sandbox/init.go')
| -rw-r--r-- | internal/sandbox/init.go | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/internal/sandbox/init.go b/internal/sandbox/init.go index 85fcb13c..058fe9a2 100644 --- a/internal/sandbox/init.go +++ b/internal/sandbox/init.go @@ -14,8 +14,6 @@ import ( "time" "git.gensokyo.uk/security/fortify/helper/proc" - "git.gensokyo.uk/security/fortify/internal" - "git.gensokyo.uk/security/fortify/internal/fmsg" "git.gensokyo.uk/security/fortify/seccomp" ) @@ -40,9 +38,9 @@ type initParams struct { Verbose bool } -func Init(exit func(code int)) { +func Init(prepare func(prefix string), setVerbose func(verbose bool)) { runtime.LockOSThread() - fmsg.Prepare("init") + prepare("init") if os.Getpid() != 1 { log.Fatal("this process must run as pid 1") @@ -72,14 +70,14 @@ func Init(exit func(code int)) { log.Fatal("invalid setup parameters") } - internal.InstallFmsg(params.Verbose) - fmsg.Verbose("received setup parameters") + setVerbose(params.Verbose) + msg.Verbose("received setup parameters") closeSetup = f offsetSetup = int(setupFile.Fd() + 1) } // write uid/gid map here so parent does not need to set dumpable - if err := internal.SetDumpable(internal.SUID_DUMP_USER); err != nil { + if err := SetDumpable(SUID_DUMP_USER); err != nil { log.Fatalf("cannot set SUID_DUMP_USER: %s", err) } if err := os.WriteFile("/proc/self/uid_map", @@ -97,7 +95,7 @@ func Init(exit func(code int)) { 0); err != nil { log.Fatalf("%v", err) } - if err := internal.SetDumpable(internal.SUID_DUMP_DISABLE); err != nil { + if err := SetDumpable(SUID_DUMP_DISABLE); err != nil { log.Fatalf("cannot set SUID_DUMP_DISABLE: %s", err) } @@ -146,11 +144,12 @@ func Init(exit func(code int)) { } for i, op := range *params.Ops { - fmsg.Verbosef("mounting %s", op) + msg.Verbosef("mounting %s", op) if err := op.apply(¶ms.InitParams); err != nil { - fmsg.PrintBaseError(err, + msg.PrintBaseErr(err, fmt.Sprintf("cannot apply op %d:", i)) - exit(1) + msg.BeforeExit() + os.Exit(1) } } @@ -169,7 +168,7 @@ func Init(exit func(code int)) { { var fd int - if err := internal.IgnoringEINTR(func() (err error) { + if err := IgnoringEINTR(func() (err error) { fd, err = syscall.Open("/", syscall.O_DIRECTORY|syscall.O_RDONLY, 0) return }); err != nil { @@ -234,7 +233,7 @@ func Init(exit func(code int)) { if err := cmd.Start(); err != nil { log.Fatalf("%v", err) } - fmsg.Suspend() + msg.Suspend() /* close setup pipe @@ -295,16 +294,17 @@ func Init(exit func(code int)) { for { select { case s := <-sig: - if fmsg.Resume() { - fmsg.Verbosef("terminating on %s after process start", s.String()) + if msg.Resume() { + msg.Verbosef("terminating on %s after process start", s.String()) } else { - fmsg.Verbosef("terminating on %s", s.String()) + msg.Verbosef("terminating on %s", s.String()) } - exit(0) + msg.BeforeExit() + os.Exit(0) case w := <-info: if w.wpid == cmd.Process.Pid { // initial process exited, output is most likely available again - fmsg.Resume() + msg.Resume() switch { case w.wstatus.Exited(): @@ -321,18 +321,22 @@ func Init(exit func(code int)) { }() } case <-done: - exit(r) + msg.BeforeExit() + os.Exit(r) case <-timeout: log.Println("timeout exceeded waiting for lingering processes") - exit(r) + msg.BeforeExit() + os.Exit(r) } } } // TryArgv0 calls [Init] if the last element of argv0 is "init". -func TryArgv0() { +func TryArgv0(v Msg, prepare func(prefix string), setVerbose func(verbose bool)) { if len(os.Args) > 0 && path.Base(os.Args[0]) == "init" { - Init(internal.Exit) - internal.Exit(0) + msg = v + Init(prepare, setVerbose) + msg.BeforeExit() + os.Exit(0) } } |
