From d5d2c23d5a489bba6be8a75ad4c5d1ac3cda4bb6 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Tue, 6 Oct 2026 21:54:48 +0900 Subject: test/internal/testsuite: directly set credentials There is no reason to keep using sudo here, now that processes are spawned natively. This change removes all use of sudo. Signed-off-by: Ophestra --- test/sharefs/main.go | 73 +++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 38 deletions(-) (limited to 'test/sharefs/main.go') diff --git a/test/sharefs/main.go b/test/sharefs/main.go index c2b6cd41..80e6ab09 100644 --- a/test/sharefs/main.go +++ b/test/sharefs/main.go @@ -9,30 +9,28 @@ import ( "log" "os" "os/exec" - "slices" "strings" + "syscall" "hakurei.app/test/internal/testsuite" ) // checkBadOpts invokes cmd/sharefs with the specified options and compares // the resulting error message. -func checkBadOpts(username, opts, want string) { +func checkBadOpts(cred *syscall.Credential, opts, want string) { var buf strings.Builder buf.Grow(len(want)) - sudo := []string{"sudo", "-u", username, "-i", "--"} - if username == "root" { - sudo = nil - } - - a := slices.Concat(sudo, []string{ + cmd := exec.Command( "sharefs", "-f", - "-o", "source=/etc," + opts, + "-o", "source=/etc,"+opts, "/mnt", - }) - cmd := exec.Command(a[0], a[1:]...) + ) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Pdeathsig: syscall.SIGKILL, + Credential: cred, + } cmd.Stderr = &buf err := cmd.Run() if err == nil { @@ -51,8 +49,8 @@ func checkBadOpts(username, opts, want string) { func main() { go testsuite.ReceiveSignals() - username := testsuite.GetUser().Username + cred := syscall.Credential{Uid: 1000, Gid: 100} if err := os.Mkdir("result", 0755); err != nil { log.Fatal(err) } @@ -62,6 +60,7 @@ func main() { defer close(done) testsuite.MustRun( + nil, nil, "fs_mark", "-v", "-d", "/sdcard/fs_mark", @@ -70,25 +69,25 @@ func main() { }() log.Println("checking malformed setuid/setgid representation") - checkBadOpts(username, "setuid=ff", "sharefs: invalid value for option setuid\n") - checkBadOpts(username, "setgid=ff", "sharefs: invalid value for option setgid\n") + checkBadOpts(&cred, "setuid=ff", "sharefs: invalid value for option setuid\n") + checkBadOpts(&cred, "setgid=ff", "sharefs: invalid value for option setgid\n") log.Println("checking bounds check for setuid/setgid") - checkBadOpts(username, "setuid=0", "sharefs: invalid value for option setuid\n") - checkBadOpts(username, "setgid=0", "sharefs: invalid value for option setgid\n") - checkBadOpts(username, "setuid=-1", "sharefs: invalid value for option setuid\n") - checkBadOpts(username, "setgid=-1", "sharefs: invalid value for option setgid\n") + checkBadOpts(&cred, "setuid=0", "sharefs: invalid value for option setuid\n") + checkBadOpts(&cred, "setgid=0", "sharefs: invalid value for option setgid\n") + checkBadOpts(&cred, "setuid=-1", "sharefs: invalid value for option setuid\n") + checkBadOpts(&cred, "setgid=-1", "sharefs: invalid value for option setgid\n") log.Println("checking non-root setuid/setgid") - checkBadOpts(username, "setuid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") - checkBadOpts(username, "setgid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") - checkBadOpts(username, "setuid=1023,setgid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") - checkBadOpts(username, "mkdir", "sharefs: mkdir has no effect when not starting as root\n") + checkBadOpts(&cred, "setuid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") + checkBadOpts(&cred, "setgid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") + checkBadOpts(&cred, "setuid=1023,setgid=1023", "sharefs: setuid and setgid has no effect when not starting as root\n") + checkBadOpts(&cred, "mkdir", "sharefs: mkdir has no effect when not starting as root\n") log.Println("checking root without setuid/setgid") - checkBadOpts("root", "allow_other", "sharefs: setuid and setgid must not be 0\n") - checkBadOpts("root", "setuid=1023", "sharefs: setuid and setgid must not be 0\n") - checkBadOpts("root", "setgid=1023", "sharefs: setuid and setgid must not be 0\n") + checkBadOpts(nil, "allow_other", "sharefs: setuid and setgid must not be 0\n") + checkBadOpts(nil, "setuid=1023", "sharefs: setuid and setgid must not be 0\n") + checkBadOpts(nil, "setgid=1023", "sharefs: setuid and setgid must not be 0\n") log.Println("verifying mount point") if err := os.Remove("/mnt"); err != nil { @@ -96,24 +95,22 @@ func main() { } log.Println("checking unprivileged mount/unmount") - testsuite.MustRunAs(username, "-i", "mkdir", "/tmp/sdcard", "/tmp/persistent") - testsuite.MustRunAs(username, "-i", "sharefs", "-o", "source=/tmp/persistent", "/tmp/sdcard") - testsuite.MustRunAs(username, "-i", "touch", "/tmp/sdcard/check") - testsuite.MustRunAs(username, "-i", "umount", "/tmp/sdcard") - testsuite.MustRunAs(username, "-i", "rm", "/tmp/persistent/check") - testsuite.MustRunAs(username, "-i", "rmdir", "/tmp/sdcard", "/tmp/persistent") + testsuite.MustRun(&cred, nil, "mkdir", "/tmp/sdcard", "/tmp/persistent") + testsuite.MustRun(&cred, nil, "sharefs", "-o", "source=/tmp/persistent", "/tmp/sdcard") + testsuite.MustRun(&cred, nil, "touch", "/tmp/sdcard/check") + testsuite.MustRun(&cred, nil, "umount", "/tmp/sdcard") + testsuite.MustRun(&cred, nil, "rm", "/tmp/persistent/check") + testsuite.MustRun(&cred, nil, "rmdir", "/tmp/sdcard", "/tmp/persistent") log.Println("waiting for fs_mark to complete") <-done - const ( - backingDir = "/var/lib/sdcard" - sharefsUser = "media_rw" - ) + const backingDir = "/var/lib/sdcard" + sharefsCred := syscall.Credential{Uid: 1023, Gid: 1023} log.Println("checking permissions") - testsuite.MustRunAs(sharefsUser, "touch", backingDir+"/fs_mark/.check") - testsuite.MustRunAs(sharefsUser, "rm", backingDir+"/fs_mark/.check") - testsuite.MustRunAs(username, "-i", "rm", "-rf", "/sdcard/fs_mark") + testsuite.MustRun(&sharefsCred, nil, "touch", backingDir+"/fs_mark/.check") + testsuite.MustRun(&sharefsCred, nil, "rm", backingDir+"/fs_mark/.check") + testsuite.MustRun(&cred, nil, "rm", "-rf", "/sdcard/fs_mark") if _, err := os.ReadDir(backingDir + "/fs_mark"); err == nil { log.Fatal("fs_mark directory was not removed") } else if !errors.Is(err, os.ErrNotExist) { -- cgit v1.3.1