aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--tests/root_test/root_test.go60
2 files changed, 65 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index b9108b2..7fd9c3d 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,11 @@ build:
test:
./test.bash
+.phony: root_test
+root_test:
+ ./build.bash
+ cd tests/root_test ; go test -c ; sudo ./root_test.test
+
.phony: format
format:
go fmt ./...
diff --git a/tests/root_test/root_test.go b/tests/root_test/root_test.go
new file mode 100644
index 0000000..3607f77
--- /dev/null
+++ b/tests/root_test/root_test.go
@@ -0,0 +1,60 @@
+package root_test
+
+import (
+ "os"
+ "runtime"
+ "syscall"
+ "testing"
+
+ "github.com/rfjakob/gocryptfs/tests/test_helpers"
+)
+
+func asUser(uid int, gid int, supplementaryGroups []int, f func() error) error {
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ err := syscall.Setgroups(supplementaryGroups)
+ if err != nil {
+ return err
+ }
+ defer syscall.Setgroups(nil)
+
+ err = syscall.Setregid(-1, gid)
+ if err != nil {
+ return err
+ }
+ defer syscall.Setregid(-1, 0)
+
+ err = syscall.Setreuid(-1, uid)
+ if err != nil {
+ return err
+ }
+ defer syscall.Setreuid(-1, 0)
+
+ return f()
+}
+
+func TestSupplementaryGroups(t *testing.T) {
+ if os.Getuid() != 0 {
+ t.Skip("must run as root")
+ }
+ cDir := test_helpers.InitFS(t)
+ pDir := cDir + ".mnt"
+ test_helpers.MountOrFatal(t, cDir, pDir, "-allow_other", "-extpass=echo test")
+ defer test_helpers.UnmountPanic(pDir)
+
+ dir1 := pDir + "/dir1"
+ err := os.Mkdir(dir1, 0770)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = os.Chown(dir1, 0, 1234)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = asUser(1235, 1235, []int{1234}, func() error { return os.Mkdir(dir1+"/foo", 0700) })
+ if err != nil {
+ t.Error(err)
+ }
+}