aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/sharefs/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/sharefs/main.go')
-rw-r--r--test/sharefs/main.go73
1 files changed, 35 insertions, 38 deletions
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) {