aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/cli/cli_test.go136
-rw-r--r--tests/cli/longnamemax_test.go5
-rw-r--r--tests/cli/xchacha_test.go5
-rw-r--r--tests/cli/zerokey_test.go5
-rw-r--r--tests/defaults/acl_test.go11
-rw-r--r--tests/defaults/diriv_test.go5
-rw-r--r--tests/defaults/getdents_linux.go9
-rw-r--r--tests/defaults/getdents_other.go11
-rw-r--r--tests/defaults/main_test.go56
-rw-r--r--tests/defaults/overlayfs_test.go7
-rw-r--r--tests/defaults/performance_test.go3
-rw-r--r--tests/deterministic_names/deterministic_names_test.go3
-rwxr-xr-xtests/dl-linux-tarball.bash2
-rw-r--r--tests/example_filesystems/example_test_helpers.go5
-rw-r--r--tests/fsck/.gitignore7
-rw-r--r--tests/fsck/fsck_test.go11
-rw-r--r--tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g0
-rw-r--r--tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g0
-rw-r--r--tests/hkdf_sanity/sanity_test.go3
-rwxr-xr-xtests/issue893.sh27
-rw-r--r--tests/matrix/matrix_test.go25
-rw-r--r--tests/plaintextnames/file_holes_test.go2
-rw-r--r--tests/plaintextnames/plaintextnames_test.go17
-rw-r--r--tests/reverse/correctness_test.go104
-rw-r--r--tests/reverse/ctlsock_test.go6
-rw-r--r--tests/reverse/exclude_test.go105
-rw-r--r--tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf21
-rw-r--r--tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf.plaintextnames18
-rw-r--r--tests/reverse/exclude_test_fs/bkp1~0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/exclude0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/file10
-rw-r--r--tests/reverse/exclude_test_fs/dir1/file20
-rw-r--r--tests/reverse/exclude_test_fs/dir1/longbkp1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/subdir1/exclude0
-rw-r--r--tests/reverse/exclude_test_fs/dir1/subdir1/subdir2/exclude0
-rw-r--r--tests/reverse/exclude_test_fs/dir2/file0
-rw-r--r--tests/reverse/exclude_test_fs/dir2/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file0
-rw-r--r--tests/reverse/exclude_test_fs/dir2/longfile.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/dir2/subdir/file0
-rw-r--r--tests/reverse/exclude_test_fs/file10
-rw-r--r--tests/reverse/exclude_test_fs/file20
-rw-r--r--tests/reverse/exclude_test_fs/file30
-rw-r--r--tests/reverse/exclude_test_fs/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file10
-rw-r--r--tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/bkp~0
-rw-r--r--tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file0
-rw-r--r--tests/reverse/exclude_test_fs/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/exclude_test_fs/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
-rw-r--r--tests/reverse/force_owner_test.go49
-rw-r--r--tests/reverse/inomap_test.go4
-rw-r--r--tests/reverse/main_test.go41
-rw-r--r--tests/reverse/one_file_system_test.go11
-rw-r--r--tests/reverse/xattr_test.go9
-rw-r--r--tests/root_test/issue893_test.go98
-rw-r--r--tests/root_test/main_test.go20
-rw-r--r--tests/root_test/root_test.go94
-rwxr-xr-xtests/stress_tests/fsstress-gocryptfs.bash11
-rwxr-xr-xtests/stress_tests/parallel_cp.sh8
-rwxr-xr-xtests/stress_tests/pingpong.bash6
-rw-r--r--tests/test_helpers/helpers.go13
-rw-r--r--tests/test_helpers/mount_unmount.go9
-rw-r--r--tests/xattr/xattr_fd_test.go4
-rw-r--r--tests/xattr/xattr_integration_test.go24
66 files changed, 733 insertions, 277 deletions
diff --git a/tests/cli/cli_test.go b/tests/cli/cli_test.go
index 686d14c..01cc3b7 100644
--- a/tests/cli/cli_test.go
+++ b/tests/cli/cli_test.go
@@ -4,8 +4,8 @@ package cli
import (
"bytes"
"encoding/hex"
+ "errors"
"fmt"
- "io/ioutil"
"os"
"os/exec"
"strconv"
@@ -116,25 +116,37 @@ func TestInitMasterkey(t *testing.T) {
// the -extpass method, then from "test" to "newpasswd" using the
// stdin method.
func testPasswd(t *testing.T, dir string, extraArgs ...string) {
- // Change password using "-extpass"
+ // Change password #1: old passwd via "-extpass", new one via stdin
args := []string{"-q", "-passwd", "-extpass", "echo test"}
args = append(args, extraArgs...)
args = append(args, dir)
cmd := exec.Command(test_helpers.GocryptfsBinary, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
- err := cmd.Run()
+ p, err := cmd.StdinPipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = cmd.Start()
if err != nil {
t.Error(err)
}
- // Change password using stdin
+ // New password through stdin
+ p.Write([]byte("test\n"))
+ p.Close()
+ err = cmd.Wait()
+ if err != nil {
+ t.Error(err)
+ }
+
+ // Change password #2: using stdin
args = []string{"-q", "-passwd"}
args = append(args, extraArgs...)
args = append(args, dir)
cmd = exec.Command(test_helpers.GocryptfsBinary, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
- p, err := cmd.StdinPipe()
+ p, err = cmd.StdinPipe()
if err != nil {
t.Fatal(err)
}
@@ -161,7 +173,7 @@ func TestPasswd(t *testing.T) {
// Add content
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
file1 := mnt + "/file1"
- err := ioutil.WriteFile(file1, []byte("somecontent"), 0600)
+ err := os.WriteFile(file1, []byte("somecontent"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -173,7 +185,7 @@ func TestPasswd(t *testing.T) {
testPasswd(t, dir)
// Mount and verify
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo newpasswd")
- content, err := ioutil.ReadFile(file1)
+ content, err := os.ReadFile(file1)
if err != nil {
t.Error(err)
} else if string(content) != "somecontent" {
@@ -188,12 +200,12 @@ func TestPasswd(t *testing.T) {
// cp copies file at `src` to `dst`, overwriting
// `dst` if it already exists. Calls t.Fatal on failure.
func cp(t *testing.T, src string, dst string) {
- conf, err := ioutil.ReadFile(src)
+ conf, err := os.ReadFile(src)
if err != nil {
t.Fatal(err)
}
syscall.Unlink(dst)
- err = ioutil.WriteFile(dst, conf, 0600)
+ err = os.WriteFile(dst, conf, 0600)
if err != nil {
t.Fatal(err)
}
@@ -209,7 +221,7 @@ func TestPasswdMasterkey(t *testing.T) {
mnt := dir + ".mnt"
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
file1 := mnt + "/file1"
- err := ioutil.WriteFile(file1, []byte("somecontent"), 0600)
+ err := os.WriteFile(file1, []byte("somecontent"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -238,7 +250,7 @@ func TestPasswdMasterkey(t *testing.T) {
}
// Mount and verify
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo newpasswd")
- content, err := ioutil.ReadFile(file1)
+ content, err := os.ReadFile(file1)
if err != nil {
t.Error(err)
} else if string(content) != "somecontent" {
@@ -257,7 +269,7 @@ func TestPasswdMasterkeyStdin(t *testing.T) {
mnt := dir + ".mnt"
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
file1 := mnt + "/file1"
- err := ioutil.WriteFile(file1, []byte("somecontent"), 0600)
+ err := os.WriteFile(file1, []byte("somecontent"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -287,7 +299,7 @@ func TestPasswdMasterkeyStdin(t *testing.T) {
}
// Mount and verify
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo newpasswd")
- content, err := ioutil.ReadFile(file1)
+ content, err := os.ReadFile(file1)
if err != nil {
t.Fatal(err)
} else if string(content) != "somecontent" {
@@ -335,10 +347,22 @@ func TestInitConfig(t *testing.T) {
"-config", config, dir)
cmd2.Stdout = os.Stdout
cmd2.Stderr = os.Stderr
- err = cmd2.Run()
+ p, err := cmd2.StdinPipe()
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = cmd2.Start()
if err != nil {
t.Error(err)
}
+ // New password
+ p.Write([]byte("passwd\n"))
+ p.Close()
+ err = cmd2.Wait()
+ if err != nil {
+ t.Error(err)
+ }
+
}
// Test -ro
@@ -367,7 +391,7 @@ func TestNonempty(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- err = ioutil.WriteFile(mnt+"/somefile", []byte("xyz"), 0600)
+ err = os.WriteFile(mnt+"/somefile", []byte("xyz"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -561,7 +585,7 @@ func TestNoexec(t *testing.T) {
content := `#!/bin/bash
echo hello
`
- err := ioutil.WriteFile(sh, []byte(content), 0755)
+ err := os.WriteFile(sh, []byte(content), 0755)
if err != nil {
t.Fatal(err)
}
@@ -672,13 +696,13 @@ func TestNotIdle(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- err = ioutil.WriteFile(mnt+"/foo", []byte("foo"), 0600)
+ err = os.WriteFile(mnt+"/foo", []byte("foo"), 0600)
if err != nil {
t.Fatal(err)
}
// Read every 10 milliseconds for a total of 1 second
for i := 1; i < 100; i++ {
- _, err = ioutil.ReadFile(mnt + "/foo")
+ _, err = os.ReadFile(mnt + "/foo")
if err != nil {
t.Fatalf("iteration %d failed: %v", i, err)
}
@@ -759,7 +783,7 @@ func TestBadname(t *testing.T) {
file := mnt + "/" + validFileName
// Case 1: write one valid filename (empty content)
- err := ioutil.WriteFile(file, nil, 0600)
+ err := os.WriteFile(file, nil, 0600)
if err != nil {
t.Fatal(err)
}
@@ -784,26 +808,26 @@ func TestBadname(t *testing.T) {
}
//Generate valid cipherdata for all cases
for i := 0; i < len(contentCipher); i++ {
- err := ioutil.WriteFile(file, []byte(fmt.Sprintf("Content Case %d.", i+1)), 0600)
+ err := os.WriteFile(file, []byte(fmt.Sprintf("Content Case %d.", i+1)), 0600)
if err != nil {
t.Fatal(err)
}
//save the cipher data for file operations in cipher dir
- contentCipher[i], err = ioutil.ReadFile(dir + "/" + encryptedfilename)
+ contentCipher[i], err = os.ReadFile(dir + "/" + encryptedfilename)
if err != nil {
t.Fatal(err)
}
}
//re-write content for case 1
- err = ioutil.WriteFile(file, []byte("Content Case 1."), 0600)
+ err = os.WriteFile(file, []byte("Content Case 1."), 0600)
if err != nil {
t.Fatal(err)
}
// Case 2: File with invalid suffix in plain name but valid cipher file
file = mnt + "/" + validFileName + nametransform.BadnameSuffix
- err = ioutil.WriteFile(file, []byte("Content Case 2."), 0600)
+ err = os.WriteFile(file, []byte("Content Case 2."), 0600)
if err != nil {
t.Fatal(err)
}
@@ -817,29 +841,29 @@ func TestBadname(t *testing.T) {
// Case 3 is impossible: only BadnameSuffix would mean the cipher name is valid
// Case 4: write invalid file which should be decodable
- err = ioutil.WriteFile(dir+"/"+encryptedfilename+invalidSuffix, contentCipher[3], 0600)
+ err = os.WriteFile(dir+"/"+encryptedfilename+invalidSuffix, contentCipher[3], 0600)
if err != nil {
t.Fatal(err)
}
//Case 5: write invalid file which is not decodable (replace last 2 bytes with percent sign)
- err = ioutil.WriteFile(dir+"/"+encryptedfilename[:len(encryptedfilename)-2]+"%%"+invalidSuffix, contentCipher[4], 0600)
+ err = os.WriteFile(dir+"/"+encryptedfilename[:len(encryptedfilename)-2]+"%%"+invalidSuffix, contentCipher[4], 0600)
if err != nil {
t.Fatal(err)
}
// Case 6: Multiple possible matches
// generate two files with invalid cipher names which can both match the badname pattern
- err = ioutil.WriteFile(dir+"/mzaZRF9_0IU-_5vv2wPC"+invalidSuffix, contentCipher[5], 0600)
+ err = os.WriteFile(dir+"/mzaZRF9_0IU-_5vv2wPC"+invalidSuffix, contentCipher[5], 0600)
if err != nil {
t.Fatal(err)
}
- err = ioutil.WriteFile(dir+"/mzaZRF9_0IU-_5vv2wP"+invalidSuffix, contentCipher[5], 0600)
+ err = os.WriteFile(dir+"/mzaZRF9_0IU-_5vv2wP"+invalidSuffix, contentCipher[5], 0600)
if err != nil {
t.Fatal(err)
}
// Case 7: Non-Matching badname pattern
- err = ioutil.WriteFile(dir+"/"+encryptedfilename+"wrongPattern", contentCipher[6], 0600)
+ err = os.WriteFile(dir+"/"+encryptedfilename+"wrongPattern", contentCipher[6], 0600)
if err != nil {
t.Fatal(err)
}
@@ -869,7 +893,7 @@ func TestBadname(t *testing.T) {
for _, name := range names {
if name == searchstrings[0] {
//Case 1: Test access
- filebytes, err = ioutil.ReadFile(mnt + "/" + name)
+ filebytes, err = os.ReadFile(mnt + "/" + name)
if err != nil {
t.Fatal(err)
}
@@ -880,7 +904,7 @@ func TestBadname(t *testing.T) {
} else if name == searchstrings[1] {
//Case 2: Test Access
- filebytes, err = ioutil.ReadFile(mnt + "/" + name)
+ filebytes, err = os.ReadFile(mnt + "/" + name)
if err != nil {
t.Fatal(err)
}
@@ -890,7 +914,7 @@ func TestBadname(t *testing.T) {
}
} else if name == searchstrings[3] {
//Case 4: Test Access
- filebytes, err = ioutil.ReadFile(mnt + "/" + name)
+ filebytes, err = os.ReadFile(mnt + "/" + name)
if err != nil {
t.Fatal(err)
}
@@ -900,7 +924,7 @@ func TestBadname(t *testing.T) {
}
} else if name == searchstrings[4] {
//Case 5: Test Access
- filebytes, err = ioutil.ReadFile(mnt + "/" + name)
+ filebytes, err = os.ReadFile(mnt + "/" + name)
if err != nil {
t.Fatal(err)
}
@@ -930,7 +954,7 @@ func TestPassfile(t *testing.T) {
dir := test_helpers.InitFS(t)
mnt := dir + ".mnt"
passfile1 := mnt + ".1.txt"
- ioutil.WriteFile(passfile1, []byte("test"), 0600)
+ os.WriteFile(passfile1, []byte("test"), 0600)
test_helpers.MountOrFatal(t, dir, mnt, "-passfile="+passfile1)
defer test_helpers.UnmountPanic(mnt)
}
@@ -941,8 +965,8 @@ func TestPassfileX2(t *testing.T) {
mnt := dir + ".mnt"
passfile1 := mnt + ".1.txt"
passfile2 := mnt + ".2.txt"
- ioutil.WriteFile(passfile1, []byte("te"), 0600)
- ioutil.WriteFile(passfile2, []byte("st"), 0600)
+ os.WriteFile(passfile1, []byte("te"), 0600)
+ os.WriteFile(passfile2, []byte("st"), 0600)
test_helpers.MountOrFatal(t, dir, mnt, "-passfile="+passfile1, "-passfile="+passfile2)
defer test_helpers.UnmountPanic(mnt)
}
@@ -954,7 +978,7 @@ func TestInitNotEmpty(t *testing.T) {
if err := os.Mkdir(dir, 0700); err != nil {
t.Fatal(err)
}
- if err := ioutil.WriteFile(dir+"/foo", nil, 0700); err != nil {
+ if err := os.WriteFile(dir+"/foo", nil, 0700); err != nil {
t.Fatal(err)
}
cmd := exec.Command(test_helpers.GocryptfsBinary, "-init", "-extpass", "echo test", dir)
@@ -976,7 +1000,7 @@ func TestSharedstorage(t *testing.T) {
defer test_helpers.UnmountPanic(mnt)
foo1 := mnt + "/foo1"
foo2 := mnt + "/foo2"
- if err := ioutil.WriteFile(foo1, nil, 0755); err != nil {
+ if err := os.WriteFile(foo1, nil, 0755); err != nil {
t.Fatal(err)
}
if err := os.Link(foo1, foo2); err != nil {
@@ -995,7 +1019,7 @@ func TestSharedstorage(t *testing.T) {
}
// Check that we we don't have stat caching. New length should show up
// on the hard link immediately.
- if err := ioutil.WriteFile(foo1, []byte("xxxxxx"), 0755); err != nil {
+ if err := os.WriteFile(foo1, []byte("xxxxxx"), 0755); err != nil {
t.Fatal(err)
}
if err := syscall.Stat(foo2, &st2); err != nil {
@@ -1033,3 +1057,39 @@ func TestMountCreat(t *testing.T) {
test_helpers.UnmountPanic(mnt)
}
}
+
+// https://github.com/rfjakob/gocryptfs/issues/776
+func TestOrphanedSocket(t *testing.T) {
+ cDir := test_helpers.InitFS(t)
+ ctlSock := cDir + ".sock"
+ mnt := cDir + ".mnt"
+ test_helpers.MountOrFatal(t, cDir, mnt, "-extpass", "echo test", "-wpanic=false", "-ctlsock", ctlSock)
+
+ mnt2 := cDir + ".mnt2"
+ err := test_helpers.Mount(cDir, mnt2, false, "-extpass", "echo test", "-wpanic=false", "-ctlsock", ctlSock)
+ exitCode := test_helpers.ExtractCmdExitCode(err)
+ if exitCode != exitcodes.CtlSock {
+ t.Errorf("wrong exit code: want=%d, have=%d", exitcodes.CtlSock, exitCode)
+ }
+ test_helpers.UnmountPanic(mnt)
+
+ // Unmount returns before the gocryptfs process has terminated and before the
+ // socket file has been deleted. Wait out the deletion.
+ for i := 0; i < 100; i++ {
+ _, err := os.Stat(ctlSock)
+ if errors.Is(err, os.ErrNotExist) {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+
+ // Create orphaned socket file
+ err = syscall.Mknod(ctlSock, syscall.S_IFSOCK|0666, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Should delete the socket file automatically and the mount should work
+ test_helpers.MountOrFatal(t, cDir, mnt, "-extpass", "echo test", "-wpanic=false", "-ctlsock", ctlSock)
+ test_helpers.UnmountPanic(mnt)
+}
diff --git a/tests/cli/longnamemax_test.go b/tests/cli/longnamemax_test.go
index e44a84e..357ede6 100644
--- a/tests/cli/longnamemax_test.go
+++ b/tests/cli/longnamemax_test.go
@@ -2,7 +2,6 @@ package cli
import (
"fmt"
- "io/ioutil"
"os"
"path/filepath"
"strings"
@@ -38,7 +37,7 @@ func TestLongnamemax100(t *testing.T) {
for l := 1; l <= 255; l++ {
path := pDir + "/" + strings.Repeat("x", l)
- if err := ioutil.WriteFile(path, nil, 0600); err != nil {
+ if err := os.WriteFile(path, nil, 0600); err != nil {
t.Fatal(err)
}
matches, err := filepath.Glob(cDir + "/gocryptfs.longname.*")
@@ -84,7 +83,7 @@ func TestLongnamemax100Reverse(t *testing.T) {
for l := 1; l <= 255; l++ {
path := backingDir + "/" + strings.Repeat("x", l)
- if err := ioutil.WriteFile(path, nil, 0600); err != nil {
+ if err := os.WriteFile(path, nil, 0600); err != nil {
t.Fatal(err)
}
matches, err := filepath.Glob(mntDir + "/gocryptfs.longname.*")
diff --git a/tests/cli/xchacha_test.go b/tests/cli/xchacha_test.go
index 7f24c8b..f0fe163 100644
--- a/tests/cli/xchacha_test.go
+++ b/tests/cli/xchacha_test.go
@@ -2,7 +2,6 @@ package cli
import (
"fmt"
- "io/ioutil"
"os"
"syscall"
"testing"
@@ -40,7 +39,7 @@ func TestXchacha(t *testing.T) {
test_helpers.MountOrExit(cDir, pDir, "-extpass", "echo test")
defer test_helpers.UnmountPanic(pDir)
- if err := ioutil.WriteFile(pDir+"/1byte", []byte("x"), 0700); err != nil {
+ if err := os.WriteFile(pDir+"/1byte", []byte("x"), 0700); err != nil {
t.Fatal(err)
}
var st syscall.Stat_t
@@ -53,7 +52,7 @@ func TestXchacha(t *testing.T) {
}
// 1 MiB = 256 4kiB blocks
- if err := ioutil.WriteFile(pDir+"/1MiB", make([]byte, 1024*1024), 0700); err != nil {
+ if err := os.WriteFile(pDir+"/1MiB", make([]byte, 1024*1024), 0700); err != nil {
t.Fatal(err)
}
if err := syscall.Stat(cDir+"/1MiB", &st); err != nil {
diff --git a/tests/cli/zerokey_test.go b/tests/cli/zerokey_test.go
index e9b9c50..359651c 100644
--- a/tests/cli/zerokey_test.go
+++ b/tests/cli/zerokey_test.go
@@ -1,7 +1,6 @@
package cli
import (
- "io/ioutil"
"os"
"os/exec"
"testing"
@@ -42,7 +41,7 @@ func TestZerokey(t *testing.T) {
mnt := dir + ".mnt"
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
file1 := mnt + "/file1"
- err = ioutil.WriteFile(file1, []byte("somecontent"), 0600)
+ err = os.WriteFile(file1, []byte("somecontent"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -50,7 +49,7 @@ func TestZerokey(t *testing.T) {
// Mount using -zerokey and verify we get the same result
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
- content, err := ioutil.ReadFile(file1)
+ content, err := os.ReadFile(file1)
if err != nil {
t.Error(err)
} else if string(content) != "somecontent" {
diff --git a/tests/defaults/acl_test.go b/tests/defaults/acl_test.go
index 2ab5dc1..0dae018 100644
--- a/tests/defaults/acl_test.go
+++ b/tests/defaults/acl_test.go
@@ -1,7 +1,6 @@
package defaults
import (
- "io/ioutil"
"math/rand"
"os"
"os/exec"
@@ -35,7 +34,7 @@ func TestCpA(t *testing.T) {
var modeWant os.FileMode = os.FileMode(rand.Int31n(0777+1) | 0400)
// Create file outside mount
- err := ioutil.WriteFile(fn1, nil, modeWant)
+ err := os.WriteFile(fn1, nil, modeWant)
if err != nil {
t.Fatal(err)
}
@@ -45,7 +44,7 @@ func TestCpA(t *testing.T) {
t.Fatal(err)
}
if fi.Mode() != modeWant {
- t.Errorf("ioutil.WriteFile created wrong permissions: want %o have %o", modeWant, fi.Mode())
+ t.Errorf("os.WriteFile created wrong permissions: want %o have %o", modeWant, fi.Mode())
}
// "cp -a" from outside to inside mount
@@ -93,7 +92,7 @@ func TestAcl543(t *testing.T) {
}
// Set acl on file outside gocryptfs mount
- err := ioutil.WriteFile(fn1, nil, modeWant)
+ err := os.WriteFile(fn1, nil, modeWant)
if err != nil {
t.Fatal(err)
}
@@ -117,7 +116,7 @@ func TestAcl543(t *testing.T) {
}
// Set acl on file inside gocryptfs mount
- err = ioutil.WriteFile(fn2, nil, modeWant)
+ err = os.WriteFile(fn2, nil, modeWant)
if err != nil {
t.Fatal(err)
}
@@ -164,7 +163,7 @@ func TestAcl543(t *testing.T) {
// Check that we handle zero-sized and undersized buffers correctly
func TestXattrOverflow(t *testing.T) {
fn := filepath.Join(test_helpers.DefaultPlainDir, t.Name())
- ioutil.WriteFile(fn, nil, 0600)
+ os.WriteFile(fn, nil, 0600)
attr := "user.foo123"
val := []byte("12341234")
diff --git a/tests/defaults/diriv_test.go b/tests/defaults/diriv_test.go
index 639b33d..48ba39a 100644
--- a/tests/defaults/diriv_test.go
+++ b/tests/defaults/diriv_test.go
@@ -1,7 +1,6 @@
package defaults
import (
- "io/ioutil"
"os"
"sync"
"sync/atomic"
@@ -19,7 +18,7 @@ func TestDirIVRace(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- err = ioutil.WriteFile(dir1+"/file", nil, 0600)
+ err = os.WriteFile(dir1+"/file", nil, 0600)
if err != nil {
t.Fatal(err)
}
@@ -31,7 +30,7 @@ func TestDirIVRace(t *testing.T) {
t.Fatal(err)
}
file2 := dir2 + "/file"
- err = ioutil.WriteFile(file2, nil, 0600)
+ err = os.WriteFile(file2, nil, 0600)
if err != nil {
t.Fatal(err)
}
diff --git a/tests/defaults/getdents_linux.go b/tests/defaults/getdents_linux.go
new file mode 100644
index 0000000..57956ce
--- /dev/null
+++ b/tests/defaults/getdents_linux.go
@@ -0,0 +1,9 @@
+package defaults
+
+import (
+ "golang.org/x/sys/unix"
+)
+
+func getdents(fd int, buf []byte) (int, error) {
+ return unix.Getdents(fd, buf)
+}
diff --git a/tests/defaults/getdents_other.go b/tests/defaults/getdents_other.go
new file mode 100644
index 0000000..c0552a8
--- /dev/null
+++ b/tests/defaults/getdents_other.go
@@ -0,0 +1,11 @@
+//go:build !linux
+
+package defaults
+
+import (
+ "golang.org/x/sys/unix"
+)
+
+func getdents(fd int, buf []byte) (int, error) {
+ return unix.Getdirentries(fd, buf, nil)
+}
diff --git a/tests/defaults/main_test.go b/tests/defaults/main_test.go
index d0210e2..a19f079 100644
--- a/tests/defaults/main_test.go
+++ b/tests/defaults/main_test.go
@@ -3,8 +3,8 @@ package defaults
import (
"bytes"
+ "fmt"
"io"
- "io/ioutil"
"os"
"os/exec"
"path/filepath"
@@ -175,7 +175,7 @@ func TestXfs124(t *testing.T) {
func TestWrite0200File(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestWrite0200File"
- err := ioutil.WriteFile(fn, nil, 0200)
+ err := os.WriteFile(fn, nil, 0200)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -211,7 +211,7 @@ func TestWrite0200File(t *testing.T) {
// Now we return EOPNOTSUPP and mv is happy.
func TestMvWarnings(t *testing.T) {
fn := test_helpers.TmpDir + "/TestMvWarnings"
- err := ioutil.WriteFile(fn, nil, 0600)
+ err := os.WriteFile(fn, nil, 0600)
if err != nil {
t.Fatalf("creating file failed: %v", err)
}
@@ -256,7 +256,7 @@ func TestMvWarningSymlink(t *testing.T) {
// See TestMvWarnings.
func TestCpWarnings(t *testing.T) {
fn := test_helpers.TmpDir + "/TestCpWarnings"
- err := ioutil.WriteFile(fn, []byte("foo"), 0600)
+ err := os.WriteFile(fn, []byte("foo"), 0600)
if err != nil {
t.Fatalf("creating file failed: %v", err)
}
@@ -506,3 +506,51 @@ func TestForceOwner(t *testing.T) {
t.Errorf("LOOKUP returned uid or gid != 1234: %#v", st)
}
}
+
+func TestSeekDir(t *testing.T) {
+ wd := test_helpers.DefaultPlainDir + "/" + t.Name()
+ err := os.Mkdir(wd, 0700)
+ if err != nil {
+ t.Fatal(err)
+ }
+ for i := 0; i < 10; i++ {
+ path := fmt.Sprintf(wd+"/%3d", i)
+ err = os.WriteFile(path, nil, 0600)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ fd, err := syscall.Open(wd, syscall.O_DIRECTORY|syscall.O_RDONLY, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer syscall.Close(fd)
+
+ buf := make([]byte, 1000)
+ n, err := getdents(fd, buf)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("1st getdents returned %d bytes", n)
+
+ n, err = getdents(fd, buf)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("2nd getdents returned %d bytes", n)
+
+ _, err = unix.Seek(fd, 0, 0)
+ if err != nil {
+ t.Error(err)
+ }
+
+ n, err = getdents(fd, buf)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("3rd getdents (after seek) returned %d bytes", n)
+ if n == 0 {
+ t.Error("Seek did not have any effect")
+ }
+}
diff --git a/tests/defaults/overlayfs_test.go b/tests/defaults/overlayfs_test.go
index 8cb773d..2b374b1 100644
--- a/tests/defaults/overlayfs_test.go
+++ b/tests/defaults/overlayfs_test.go
@@ -4,7 +4,6 @@
package defaults
import (
- "io/ioutil"
"os"
"strings"
"testing"
@@ -43,7 +42,7 @@ func TestRenameWhiteout(t *testing.T) {
for _, n := range names {
pSrc := test_helpers.DefaultPlainDir + "/" + n[0]
pDst := test_helpers.DefaultPlainDir + "/" + n[1]
- if err := ioutil.WriteFile(pSrc, nil, 0200); err != nil {
+ if err := os.WriteFile(pSrc, nil, 0200); err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
err := unix.Renameat2(-1, pSrc, -1, pDst, flags)
@@ -96,10 +95,10 @@ func TestRenameExchange(t *testing.T) {
for _, n := range names {
pSrc := test_helpers.DefaultPlainDir + "/" + n[0]
pDst := test_helpers.DefaultPlainDir + "/" + n[1]
- if err := ioutil.WriteFile(pSrc, nil, 0200); err != nil {
+ if err := os.WriteFile(pSrc, nil, 0200); err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
- if err := ioutil.WriteFile(pDst, nil, 0200); err != nil {
+ if err := os.WriteFile(pDst, nil, 0200); err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
err := unix.Renameat2(-1, pSrc, -1, pDst, unix.RENAME_EXCHANGE)
diff --git a/tests/defaults/performance_test.go b/tests/defaults/performance_test.go
index 11d827f..8bae5c1 100644
--- a/tests/defaults/performance_test.go
+++ b/tests/defaults/performance_test.go
@@ -4,7 +4,6 @@ package defaults
import (
"fmt"
"io"
- "io/ioutil"
"os"
"testing"
@@ -96,7 +95,7 @@ func createFiles(t *testing.B, count int, size int) {
for i = 0; i < count; i++ {
file := fmt.Sprintf("%s/%d", dir, i)
if size > 0 {
- err = ioutil.WriteFile(file, buf, 0666)
+ err = os.WriteFile(file, buf, 0666)
} else {
var fh *os.File
fh, err = os.Create(file)
diff --git a/tests/deterministic_names/deterministic_names_test.go b/tests/deterministic_names/deterministic_names_test.go
index 00d80fc..330cfc3 100644
--- a/tests/deterministic_names/deterministic_names_test.go
+++ b/tests/deterministic_names/deterministic_names_test.go
@@ -4,7 +4,6 @@ package deterministic_names
import (
"fmt"
- "io/ioutil"
"os"
"path/filepath"
"testing"
@@ -70,7 +69,7 @@ func TestDeterministicNames(t *testing.T) {
if err := os.RemoveAll(pDir + "/foo"); err != nil {
t.Fatal(err)
}
- if err := ioutil.WriteFile(pDir+"/foo", nil, 0700); err != nil {
+ if err := os.WriteFile(pDir+"/foo", nil, 0700); err != nil {
t.Fatal(err)
}
_, err = os.Stat(cDir + "/" + fooEncrypted)
diff --git a/tests/dl-linux-tarball.bash b/tests/dl-linux-tarball.bash
index dfff492..03c0e7d 100755
--- a/tests/dl-linux-tarball.bash
+++ b/tests/dl-linux-tarball.bash
@@ -20,7 +20,7 @@ fi
if [[ $SIZE_ACTUAL -ne $SIZE_WANT ]]; then
echo "Downloading linux-3.0.tar.gz"
if command -v wget > /dev/null ; then
- wget -nv --show-progress -c -O "$TGZ" "$URL"
+ wget -nv -c -O "$TGZ" "$URL"
else
curl -o "$TGZ" "$URL"
fi
diff --git a/tests/example_filesystems/example_test_helpers.go b/tests/example_filesystems/example_test_helpers.go
index c56d75a..34e5786 100644
--- a/tests/example_filesystems/example_test_helpers.go
+++ b/tests/example_filesystems/example_test_helpers.go
@@ -1,7 +1,6 @@
package example_filesystems
import (
- "io/ioutil"
"os"
"path/filepath"
"testing"
@@ -15,7 +14,7 @@ const statusTxtContent = "It works!\n"
func checkExampleFS(t *testing.T, dir string, rw bool) {
// Read regular file
statusFile := filepath.Join(dir, "status.txt")
- contentBytes, err := ioutil.ReadFile(statusFile)
+ contentBytes, err := os.ReadFile(statusFile)
if err != nil {
t.Error(err)
return
@@ -68,7 +67,7 @@ func checkExampleFSrw(t *testing.T, dir string, rw bool) {
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
"xxxxxxxxxxxxxxxxxxxxxxxx"
- contentBytes, err := ioutil.ReadFile(filepath.Join(dir, longname))
+ contentBytes, err := os.ReadFile(filepath.Join(dir, longname))
if err != nil {
t.Error(err)
return
diff --git a/tests/fsck/.gitignore b/tests/fsck/.gitignore
new file mode 100644
index 0000000..9c9febc
--- /dev/null
+++ b/tests/fsck/.gitignore
@@ -0,0 +1,7 @@
+# Cannot have these "evil" files in git because they break "go install"
+# https://github.com/golang/go/issues/28001
+#
+# "malleable_base64/27AG8t-XZH7G9ou2OSD_z\ng"
+# "malleable_base64/27AG8t-XZH7G9ou2OSD_z\rg"
+#
+malleable_base64/27AG8t-XZH7G9ou2OSD_z?g
diff --git a/tests/fsck/fsck_test.go b/tests/fsck/fsck_test.go
index b70fd49..de49819 100644
--- a/tests/fsck/fsck_test.go
+++ b/tests/fsck/fsck_test.go
@@ -50,6 +50,17 @@ func TestBrokenFsV14(t *testing.T) {
}
func TestMalleableBase64(t *testing.T) {
+ // Evil filenames. Cannot have them in git, because if we do,
+ // go install github.com/rfjakob/gocryptfs/v2@latest
+ // fails with
+ // g: malformed file path "tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z\rg": invalid char '\r'
+ // g: malformed file path "tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z\rg": invalid char '\r'
+ if err := os.WriteFile("malleable_base64/27AG8t-XZH7G9ou2OSD_z\ng", nil, 0644); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile("malleable_base64/27AG8t-XZH7G9ou2OSD_z\rg", nil, 0644); err != nil {
+ t.Fatal(err)
+ }
cmd := exec.Command(test_helpers.GocryptfsBinary, "-fsck", "-extpass", "echo test", "malleable_base64")
outBin, err := cmd.CombinedOutput()
out := string(outBin)
diff --git a/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g b/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g
deleted file mode 100644
index e69de29..0000000
--- a/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g
+++ /dev/null
diff --git a/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g b/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g
deleted file mode 100644
index e69de29..0000000
--- a/tests/fsck/malleable_base64/27AG8t-XZH7G9ou2OSD_z g
+++ /dev/null
diff --git a/tests/hkdf_sanity/sanity_test.go b/tests/hkdf_sanity/sanity_test.go
index f221439..27a1085 100644
--- a/tests/hkdf_sanity/sanity_test.go
+++ b/tests/hkdf_sanity/sanity_test.go
@@ -4,7 +4,6 @@
package hkdf_sanity
import (
- "io/ioutil"
"os"
"testing"
@@ -15,7 +14,7 @@ func TestBrokenContent(t *testing.T) {
cDir := "broken_content"
pDir := test_helpers.TmpDir + "/" + cDir
test_helpers.MountOrFatal(t, cDir, pDir, "-extpass", "echo test", "-wpanic=false")
- _, err := ioutil.ReadFile(pDir + "/status.txt")
+ _, err := os.ReadFile(pDir + "/status.txt")
if err == nil {
t.Error("this should fail")
}
diff --git a/tests/issue893.sh b/tests/issue893.sh
new file mode 100755
index 0000000..a1e7cdb
--- /dev/null
+++ b/tests/issue893.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Reproducer for https://github.com/rfjakob/gocryptfs/issues/893 .
+# Run this script as non-root against a root-mounted gocryptfs -allow_other.
+
+set -eu
+
+mountpoint $1
+cd $1
+
+work() {
+ for i in $(seq 100) ; do
+ D=mtest.$BASHPID.$i/foo/bar/baz
+ mkdir -p $D
+ touch $D/foo $D/bar
+ echo AAAAAAAAAAAAAAAAAAAAA > $D/foo
+ rm $D/foo
+ mkdir $D/baz
+ done
+}
+
+rm -Rf mtest.*
+echo .
+
+work &
+work &
+
+wait
diff --git a/tests/matrix/matrix_test.go b/tests/matrix/matrix_test.go
index 0d9c22c..b406517 100644
--- a/tests/matrix/matrix_test.go
+++ b/tests/matrix/matrix_test.go
@@ -10,7 +10,6 @@ import (
"bytes"
"flag"
"fmt"
- "io/ioutil"
"math/rand"
"os"
"os/exec"
@@ -327,7 +326,7 @@ func TestFileHoles(t *testing.T) {
foo := []byte("foo")
file.Write(foo)
file.WriteAt(foo, 4096)
- _, err = ioutil.ReadFile(fn)
+ _, err = os.ReadFile(fn)
if err != nil {
t.Error(err)
}
@@ -391,7 +390,7 @@ func TestRmwRace(t *testing.T) {
// but it must not be
// [oooooossss]
- buf, _ := ioutil.ReadFile(fn)
+ buf, _ := os.ReadFile(fn)
m := test_helpers.Md5hex(buf)
goodMd5[m] = goodMd5[m] + 1
@@ -495,7 +494,7 @@ func TestNameLengths(t *testing.T) {
}
func TestLongNames(t *testing.T) {
- fi, err := ioutil.ReadDir(test_helpers.DefaultCipherDir)
+ fi, err := os.ReadDir(test_helpers.DefaultCipherDir)
if err != nil {
t.Fatal(err)
}
@@ -607,7 +606,7 @@ func TestLongNames(t *testing.T) {
t.Error(err)
}
// Check for orphaned files
- fi, err = ioutil.ReadDir(test_helpers.DefaultCipherDir)
+ fi, err = os.ReadDir(test_helpers.DefaultCipherDir)
if err != nil {
t.Fatal(err)
}
@@ -740,7 +739,7 @@ func doTestUtimesNano(t *testing.T, path string) {
// Set nanoseconds by path, normal file
func TestUtimesNano(t *testing.T) {
path := test_helpers.DefaultPlainDir + "/utimesnano"
- err := ioutil.WriteFile(path, []byte("foobar"), 0600)
+ err := os.WriteFile(path, []byte("foobar"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -788,7 +787,7 @@ func TestMagicNames(t *testing.T) {
t.Logf("Testing n=%q", n)
p := test_helpers.DefaultPlainDir + "/" + n
// Create file
- err := ioutil.WriteFile(p, []byte("xxxxxxx"), 0200)
+ err := os.WriteFile(p, []byte("xxxxxxx"), 0200)
if err != nil {
t.Fatalf("creating file %q failed: %v", n, err)
}
@@ -825,7 +824,7 @@ func TestMagicNames(t *testing.T) {
syscall.Unlink(p)
// Link
target := test_helpers.DefaultPlainDir + "/linktarget"
- err = ioutil.WriteFile(target, []byte("yyyyy"), 0600)
+ err = os.WriteFile(target, []byte("yyyyy"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -972,3 +971,13 @@ func TestPwd(t *testing.T) {
os.Mkdir(dir, 0700)
}
}
+
+// TestRootIno checks that inode number of the root dir is set
+// https://github.com/hanwen/go-fuse/issues/399
+func TestRootIno(t *testing.T) {
+ var st syscall.Stat_t
+ syscall.Stat(test_helpers.DefaultPlainDir, &st)
+ if st.Ino == 0 {
+ t.Errorf("inode number of root dir is zero")
+ }
+}
diff --git a/tests/plaintextnames/file_holes_test.go b/tests/plaintextnames/file_holes_test.go
index a17597a..ea47113 100644
--- a/tests/plaintextnames/file_holes_test.go
+++ b/tests/plaintextnames/file_holes_test.go
@@ -129,6 +129,8 @@ func doTestFileHoleCopy(t *testing.T, name string, writeOffsets []int64) {
// The test runs with -plaintextnames because that makes it easier to manipulate
// cipherdir directly.
func TestFileHoleCopy(t *testing.T) {
+ t.Skip("TODO: find out why this fails on recent kernels")
+
// | hole | x | hole | x | hole |
// truncate -s 50000 foo && dd if=/dev/zero of=foo bs=1 seek=10000 count=1 conv=notrunc && dd if=/dev/zero of=foo bs=1 seek=30000 count=1 conv=notrunc
name := "c0"
diff --git a/tests/plaintextnames/plaintextnames_test.go b/tests/plaintextnames/plaintextnames_test.go
index 8892c39..a755deb 100644
--- a/tests/plaintextnames/plaintextnames_test.go
+++ b/tests/plaintextnames/plaintextnames_test.go
@@ -4,7 +4,6 @@ package plaintextnames
import (
"fmt"
- "io/ioutil"
"os"
"syscall"
"testing"
@@ -63,7 +62,7 @@ func TestDirIV(t *testing.T) {
// else should work.
func TestFiltered(t *testing.T) {
filteredFile := pDir + "/gocryptfs.conf"
- err := ioutil.WriteFile(filteredFile, []byte("foo"), 0777)
+ err := os.WriteFile(filteredFile, []byte("foo"), 0777)
if err == nil {
t.Errorf("should have failed but didn't")
}
@@ -71,11 +70,11 @@ func TestFiltered(t *testing.T) {
if err == nil {
t.Errorf("should have failed but didn't")
}
- err = ioutil.WriteFile(pDir+"/gocryptfs.diriv", []byte("foo"), 0777)
+ err = os.WriteFile(pDir+"/gocryptfs.diriv", []byte("foo"), 0777)
if err != nil {
t.Error(err)
}
- subDir, err := ioutil.TempDir(pDir, "")
+ subDir, err := os.MkdirTemp(pDir, "")
if err != nil {
t.Fatal(err)
}
@@ -125,3 +124,13 @@ func TestInoReuseEvil(t *testing.T) {
t.Logf("file ino = %d", st.Ino)
}
}
+
+// TestRootIno checks that inode number of the root dir is set
+// https://github.com/hanwen/go-fuse/issues/399
+func TestRootIno(t *testing.T) {
+ var st syscall.Stat_t
+ syscall.Stat(cDir, &st)
+ if st.Ino == 0 {
+ t.Errorf("inode number of root dir is zero")
+ }
+}
diff --git a/tests/reverse/correctness_test.go b/tests/reverse/correctness_test.go
index b335456..4028ac3 100644
--- a/tests/reverse/correctness_test.go
+++ b/tests/reverse/correctness_test.go
@@ -3,7 +3,6 @@ package reverse_test
import (
"bytes"
"fmt"
- "io/ioutil"
"os"
"path/filepath"
"strings"
@@ -72,7 +71,7 @@ func TestSymlinkDentrySize(t *testing.T) {
}
symlink := "a_symlink"
- mnt, err := ioutil.TempDir(test_helpers.TmpDir, "reverse_mnt_")
+ mnt, err := os.MkdirTemp(test_helpers.TmpDir, "reverse_mnt_")
if err != nil {
t.Fatal(err)
}
@@ -111,7 +110,7 @@ func TestConfigMapping(t *testing.T) {
if !test_helpers.VerifyExistence(t, c) {
t.Errorf("%s missing", c)
}
- data, err := ioutil.ReadFile(c)
+ data, err := os.ReadFile(c)
if err != nil {
t.Fatal(err)
}
@@ -233,7 +232,7 @@ func Test0100Dir(t *testing.T) {
t.Fatal(err)
}
file := dir + "/hello"
- err = ioutil.WriteFile(file, []byte("hello"), 0600)
+ err = os.WriteFile(file, []byte("hello"), 0600)
if err != nil {
t.Fatal(err)
}
@@ -295,6 +294,23 @@ func TestSeekData(t *testing.T) {
f.Close()
}
+// newWorkdir creates a new empty dir in dirA and returns the full path to it along
+// with the corresponding encrypted path in dirB
+func newWorkdir(t *testing.T) (workdirA, workdirB string) {
+ workdirA = dirA + "/" + t.Name()
+ if err := os.Mkdir(workdirA, 0700); err != nil {
+ t.Fatal(err)
+ }
+ // Find workdir in dirB (=encrypted view)
+ var st syscall.Stat_t
+ if err := syscall.Stat(workdirA, &st); err != nil {
+ t.Fatal(err)
+ }
+ workdirB = dirB + "/" + findIno(dirB, st.Ino)
+ t.Logf("newWorkdir: workdirA=%q workdirB=%q", workdirA, workdirB)
+ return
+}
+
// gocryptfs.longname.*.name of hardlinked files should not appear hardlinked (as the
// contents are different).
//
@@ -308,28 +324,22 @@ func TestHardlinkedLongname(t *testing.T) {
t.Skip()
}
- workdir := dirA + "/" + t.Name()
- if err := os.Mkdir(workdir, 0700); err != nil {
+ workdirA, workdirB := newWorkdir(t)
+
+ long1 := workdirA + "/" + strings.Repeat("x", 200)
+ if err := os.WriteFile(long1, []byte("hello"), 0600); err != nil {
t.Fatal(err)
}
- long1 := workdir + "/" + strings.Repeat("x", 200)
- if err := ioutil.WriteFile(long1, []byte("hello"), 0600); err != nil {
+ var long1_stat syscall.Stat_t
+ if err := syscall.Stat(long1, &long1_stat); err != nil {
t.Fatal(err)
}
- long2 := workdir + "/" + strings.Repeat("y", 220)
+ long2 := workdirA + "/" + strings.Repeat("y", 220)
if err := syscall.Link(long1, long2); err != nil {
t.Fatal(err)
}
- // Find workdir in encrypted view
- var st syscall.Stat_t
- if err := syscall.Stat(workdir, &st); err != nil {
- t.Fatal(err)
- }
- cWorkdir := dirB + "/" + findIno(dirB, st.Ino)
- t.Logf("workdir=%q cWorkdir=%q", workdir, cWorkdir)
-
- matches, err := filepath.Glob(cWorkdir + "/gocryptfs.longname.*.name")
+ matches, err := filepath.Glob(workdirB + "/gocryptfs.longname.*.name")
if err != nil {
t.Fatal(err)
}
@@ -352,3 +362,61 @@ func TestHardlinkedLongname(t *testing.T) {
t.Errorf("Files %q have the same inode number - that's wrong!", matches)
}
}
+
+// With inode number reuse and hard links, we could have returned
+// wrong data for gocryptfs.diriv and gocryptfs.xyz.longname files, respectively
+// (https://github.com/rfjakob/gocryptfs/issues/802).
+//
+// Now that this is fixed, ensure that rsync and similar tools pick up the new
+// correct files by advancing mtime and ctime by 10 seconds, which should be more
+// than any filesytems' timestamp granularity (FAT32 has 2 seconds).
+func TestMtimePlus10(t *testing.T) {
+ if plaintextnames {
+ t.Skip("plaintextnames mode does not have virtual files")
+ }
+
+ workdirA, workdirB := newWorkdir(t)
+
+ long := workdirA + "/" + strings.Repeat("x", 200)
+ if err := os.WriteFile(long, nil, 0600); err != nil {
+ t.Fatal(err)
+ }
+ long_stat, err := os.Stat(long)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ workdirA_stat, err := os.Stat(workdirA)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Find and check gocryptfs.longname.*.name
+ matches, err := filepath.Glob(workdirB + "/gocryptfs.longname.*.name")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if len(matches) != 1 {
+ t.Fatal(matches)
+ }
+ name_stat, err := os.Stat(matches[0])
+ if err != nil {
+ t.Fatal(err)
+ }
+ if name_stat.ModTime().Unix() != long_stat.ModTime().Unix()+10 {
+ t.Errorf(".name file should show mtime+10")
+ }
+
+ // Check gocryptfs.diriv
+ if deterministic_names {
+ // No gocryptfs.diriv
+ return
+ }
+ diriv_stat, err := os.Stat(workdirB + "/gocryptfs.diriv")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if diriv_stat.ModTime().Unix() != workdirA_stat.ModTime().Unix()+10 {
+ t.Errorf("diriv file should show mtime+10")
+ }
+}
diff --git a/tests/reverse/ctlsock_test.go b/tests/reverse/ctlsock_test.go
index f59fa45..8f9d843 100644
--- a/tests/reverse/ctlsock_test.go
+++ b/tests/reverse/ctlsock_test.go
@@ -1,7 +1,7 @@
package reverse_test
import (
- "io/ioutil"
+ "os"
"syscall"
"testing"
@@ -28,7 +28,7 @@ func TestCtlSockPathOps(t *testing.T) {
if plaintextnames {
t.Skip("this only tests encrypted names")
}
- mnt, err := ioutil.TempDir(test_helpers.TmpDir, "reverse_mnt_")
+ mnt, err := os.MkdirTemp(test_helpers.TmpDir, "reverse_mnt_")
if err != nil {
t.Fatal(err)
}
@@ -74,7 +74,7 @@ func TestCtlSockCrash(t *testing.T) {
if plaintextnames {
t.Skip("this only tests encrypted names")
}
- mnt, err := ioutil.TempDir(test_helpers.TmpDir, "reverse_mnt_")
+ mnt, err := os.MkdirTemp(test_helpers.TmpDir, "reverse_mnt_")
if err != nil {
t.Fatal(err)
}
diff --git a/tests/reverse/exclude_test.go b/tests/reverse/exclude_test.go
index f24ff2c..645d267 100644
--- a/tests/reverse/exclude_test.go
+++ b/tests/reverse/exclude_test.go
@@ -1,7 +1,8 @@
package reverse_test
import (
- "io/ioutil"
+ "log"
+ "os"
"path/filepath"
"testing"
@@ -19,36 +20,29 @@ func ctlsockEncryptPath(t *testing.T, sock string, path string) string {
return response.Result
}
-// doTestExcludeTestFs runs exclude tests against the exclude_test_fs folder
-func doTestExcludeTestFs(t *testing.T, flag string, patterns, visible, hidden []string) {
- // Mount reverse fs
- mnt, err := ioutil.TempDir(test_helpers.TmpDir, t.Name())
- if err != nil {
- t.Fatal(err)
- }
- sock := mnt + ".sock"
- cliArgs := []string{"-reverse", "-extpass", "echo test", "-ctlsock", sock}
+// doTestExcludeTestFs runs exclude tests against the exclude_test_fs folder.
+// flag is either "--exclude-wildcard" or "--exclude"
+func doTestExcludeTestFs(t *testing.T, flag string, patterns []string, tree directoryTree) {
+ var extraArgs []string
for _, v := range patterns {
- cliArgs = append(cliArgs, flag, v)
- }
- if plaintextnames {
- cliArgs = append(cliArgs, "-config", "exclude_test_fs/.gocryptfs.reverse.conf.plaintextnames")
+ extraArgs = append(extraArgs, flag, v)
}
- test_helpers.MountOrFatal(t, "exclude_test_fs", mnt, cliArgs...)
+ // Mount reverse fs
+ backingDir, mnt, sock := newReverseFS(extraArgs)
defer test_helpers.UnmountPanic(mnt)
+ tree.createOnDisk(backingDir)
+
// Get encrypted version of visible and hidden paths
- cVisible := encryptExcludeTestPaths(t, sock, visible)
- cHidden := encryptExcludeTestPaths(t, sock, hidden)
+ cVisible := encryptExcludeTestPaths(t, sock, tree.visible())
+ cHidden := encryptExcludeTestPaths(t, sock, tree.hidden())
// Check that hidden paths are not there and visible paths are there
for _, v := range cHidden {
if test_helpers.VerifyExistence(t, mnt+"/"+v) {
t.Errorf("File %q is visible, but should be hidden", v)
}
- if nametransform.IsLongContent(filepath.Base(v)) {
- // TODO ???
- }
+
}
for _, v := range cVisible {
if !test_helpers.VerifyExistence(t, mnt+"/"+v) {
@@ -74,6 +68,44 @@ func encryptExcludeTestPaths(t *testing.T, socket string, pRelPaths []string) (o
return out
}
+type directoryTree struct {
+ visibleFiles []string
+ visibleDirs []string
+ hiddenFiles []string
+ hiddenDirs []string
+}
+
+func (tr *directoryTree) visible() []string {
+ return append(tr.visibleDirs, tr.visibleFiles...)
+}
+
+func (tr *directoryTree) hidden() []string {
+ return append(tr.hiddenDirs, tr.hiddenFiles...)
+}
+
+func (tr *directoryTree) createOnDisk(baseDir string) {
+ dirs := append(tr.hiddenDirs, tr.visibleDirs...)
+ for _, d := range dirs {
+ err := os.MkdirAll(baseDir+"/"+d, 0700)
+ if err != nil {
+ log.Panic(err)
+ }
+ }
+
+ files := append(tr.hiddenFiles, tr.visibleFiles...)
+ for _, f := range files {
+ d := filepath.Dir(f)
+ err := os.MkdirAll(baseDir+"/"+d, 0700)
+ if err != nil {
+ log.Panic(err)
+ }
+ err = os.WriteFile(baseDir+"/"+f, nil, 0600)
+ if err != nil {
+ log.Panic(err)
+ }
+ }
+}
+
// TestExcludeTestFs runs exclude tests against the exclude_test_fs folder.
func TestExcludeTestFs(t *testing.T) {
// --exclude-wildcard patterns, gitignore syntax
@@ -90,19 +122,22 @@ func TestExcludeTestFs(t *testing.T) {
"dir1/**/exclude", // ** matches any number of directories
"file3/", // pattern with trailing slash should not match a file
}
+ var tree directoryTree
// visible are plaintext paths that should be visible in the encrypted view
- visible := []string{
+ tree.visibleFiles = []string{
"file2",
"dir1/longfile1" + x240,
"dir1/longfile3" + x240,
- "longdir1" + x240,
"longdir1" + x240 + "/file1",
"longdir2" + x240 + "/file",
"longfile1" + x240,
"file3",
}
+ tree.visibleDirs = []string{
+ "longdir1" + x240,
+ }
// hidden are plaintext paths that should be hidden in the encrypted view
- hidden := []string{
+ tree.hiddenFiles = []string{
"bkp1~",
"dir1/file1",
"dir1/file2",
@@ -111,20 +146,21 @@ func TestExcludeTestFs(t *testing.T) {
"dir1/longfile2" + x240,
"dir1/subdir1/exclude",
"dir1/subdir1/subdir2/exclude",
- "dir2",
"dir2/file",
"dir2/longdir1" + x240 + "/file",
"dir2/longfile." + x240,
- "dir2/subdir",
"dir2/subdir/file",
"file1",
"longdir2" + x240 + "/bkp~",
"longfile2" + x240,
"longfile3" + x240,
}
-
- doTestExcludeTestFs(t, "-exclude-wildcard", patterns, visible, hidden)
- doTestExcludeTestFs(t, "-ew", patterns, visible, hidden)
+ tree.hiddenDirs = []string{
+ "dir2",
+ "dir2/subdir",
+ }
+ doTestExcludeTestFs(t, "-exclude-wildcard", patterns, tree)
+ doTestExcludeTestFs(t, "-ew", patterns, tree)
}
// Exclude everything using "/*", then selectively include only dir1 using "!/dir1"
@@ -135,23 +171,28 @@ func TestExcludeAllOnlyDir1(t *testing.T) {
"*",
"!/dir1",
}
+ var tree directoryTree
// visible are plaintext paths that should be visible in the encrypted view
- visible := []string{
+ tree.visibleDirs = []string{
"dir1",
+ }
+ tree.visibleFiles = []string{
"dir1/file1",
}
// hidden are plaintext paths that should be hidden in the encrypted view
- hidden := []string{
+ tree.hiddenDirs = []string{
"dir2",
+ "dir2/subdir",
+ }
+ tree.hiddenFiles = []string{
"dir2/file",
"dir2/longdir1" + x240 + "/file",
"dir2/longfile." + x240,
- "dir2/subdir",
"dir2/subdir/file",
"file1",
"longdir2" + x240 + "/bkp~",
"longfile2" + x240,
"longfile3" + x240,
}
- doTestExcludeTestFs(t, "-exclude-wildcard", patterns, visible, hidden)
+ doTestExcludeTestFs(t, "-exclude-wildcard", patterns, tree)
}
diff --git a/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf b/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf
deleted file mode 100644
index 835d11c..0000000
--- a/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "Creator": "gocryptfs v1.5-41-gf48b731-dirty",
- "EncryptedKey": "FkACqloUeFZesem0UzRD3ezLXtPl8wIAxEHoIEfZxFdLMQeWOxqtw5xopJagDWE/GI1VFSUIrJIIIwwgMipmYA==",
- "ScryptObject": {
- "Salt": "UVfIgV31uj/voHWI4GqGwsTcbVKyYDOWvbleqJKhZbk=",
- "N": 1024,
- "R": 8,
- "P": 1,
- "KeyLen": 32
- },
- "Version": 2,
- "FeatureFlags": [
- "GCMIV128",
- "HKDF",
- "DirIV",
- "EMENames",
- "LongNames",
- "Raw64",
- "AESSIV"
- ]
-}
diff --git a/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf.plaintextnames b/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf.plaintextnames
deleted file mode 100644
index 9cb762c..0000000
--- a/tests/reverse/exclude_test_fs/.gocryptfs.reverse.conf.plaintextnames
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "Creator": "gocryptfs v1.5-41-gf48b731-dirty",
- "EncryptedKey": "wAmckZb7QsIv/GCdkhb5ep8TwJa44qhnswn5tbER6Tifk8TbUmkwBTceaTtYfHAnTQ48q9mnIlcN9cfbNe5oPw==",
- "ScryptObject": {
- "Salt": "o5XJ78TgG85zZXRnU55ZqHhKLbPge6jsyDiqrLvSqe0=",
- "N": 1024,
- "R": 8,
- "P": 1,
- "KeyLen": 32
- },
- "Version": 2,
- "FeatureFlags": [
- "GCMIV128",
- "HKDF",
- "PlaintextNames",
- "AESSIV"
- ]
-}
diff --git a/tests/reverse/exclude_test_fs/bkp1~ b/tests/reverse/exclude_test_fs/bkp1~
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/bkp1~
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/exclude b/tests/reverse/exclude_test_fs/dir1/exclude
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/exclude
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/file1 b/tests/reverse/exclude_test_fs/dir1/file1
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/file1
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/file2 b/tests/reverse/exclude_test_fs/dir1/file2
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/file2
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/longbkp1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~ b/tests/reverse/exclude_test_fs/dir1/longbkp1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/longbkp1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/dir1/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/dir1/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/dir1/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/subdir1/exclude b/tests/reverse/exclude_test_fs/dir1/subdir1/exclude
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/subdir1/exclude
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir1/subdir1/subdir2/exclude b/tests/reverse/exclude_test_fs/dir1/subdir1/subdir2/exclude
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir1/subdir1/subdir2/exclude
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir2/file b/tests/reverse/exclude_test_fs/dir2/file
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir2/file
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir2/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file b/tests/reverse/exclude_test_fs/dir2/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir2/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir2/longfile.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/dir2/longfile.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir2/longfile.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/dir2/subdir/file b/tests/reverse/exclude_test_fs/dir2/subdir/file
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/dir2/subdir/file
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/file1 b/tests/reverse/exclude_test_fs/file1
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/file1
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/file2 b/tests/reverse/exclude_test_fs/file2
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/file2
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/file3 b/tests/reverse/exclude_test_fs/file3
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/file3
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file1 b/tests/reverse/exclude_test_fs/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file1
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longdir1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file1
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/bkp~ b/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/bkp~
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/bkp~
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file b/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longdir2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/file
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longfile1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longfile2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/exclude_test_fs/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx b/tests/reverse/exclude_test_fs/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
deleted file mode 100644
index e69de29..0000000
--- a/tests/reverse/exclude_test_fs/longfile3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++ /dev/null
diff --git a/tests/reverse/force_owner_test.go b/tests/reverse/force_owner_test.go
new file mode 100644
index 0000000..aeb0a4e
--- /dev/null
+++ b/tests/reverse/force_owner_test.go
@@ -0,0 +1,49 @@
+package reverse_test
+
+import (
+ "net/url"
+ "os"
+ "syscall"
+ "testing"
+
+ "github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
+)
+
+func TestForceOwner(t *testing.T) {
+ // Let's not explode with "TempDir: pattern contains path separator"
+ myEscapedName := url.PathEscape(t.Name())
+ mnt, err := os.MkdirTemp(test_helpers.TmpDir, myEscapedName)
+ if err != nil {
+ t.Fatal(err)
+ }
+ cliArgs := []string{"-reverse", "-zerokey", "-force_owner=1234:1234"}
+ if plaintextnames {
+ cliArgs = append(cliArgs, "-plaintextnames")
+ } else if deterministic_names {
+ cliArgs = append(cliArgs, "-deterministic-names")
+ }
+ test_helpers.MountOrFatal(t, "/", mnt, cliArgs...)
+ defer test_helpers.UnmountErr(mnt)
+
+ entries, err := os.ReadDir(mnt)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Check the mountpoint and everything inside it
+ toCheck := []string{mnt}
+ for _, e := range entries {
+ toCheck = append(toCheck, mnt+"/"+e.Name())
+ }
+
+ var st syscall.Stat_t
+ for _, path := range toCheck {
+ if err := syscall.Lstat(path, &st); err != nil {
+ t.Fatal(err)
+ }
+ if st.Uid != 1234 || st.Gid != 1234 {
+ t.Errorf("file %q: uid or gid != 1234: %#v", path, st)
+ }
+ }
+
+}
diff --git a/tests/reverse/inomap_test.go b/tests/reverse/inomap_test.go
index ff78f4c..fadf6a5 100644
--- a/tests/reverse/inomap_test.go
+++ b/tests/reverse/inomap_test.go
@@ -85,7 +85,7 @@ func TestVirtualFileIno(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- dirents, err := fd.Readdirnames(0)
+ _, err = fd.Readdirnames(0)
if err != nil {
t.Fatal(err)
}
@@ -104,7 +104,7 @@ func TestVirtualFileIno(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- dirents, err = fd.Readdirnames(0)
+ dirents, err := fd.Readdirnames(0)
if err != nil {
t.Fatal(err)
}
diff --git a/tests/reverse/main_test.go b/tests/reverse/main_test.go
index 2fc9e5e..6a3ed9b 100644
--- a/tests/reverse/main_test.go
+++ b/tests/reverse/main_test.go
@@ -2,7 +2,9 @@ package reverse_test
import (
"bytes"
+ "flag"
"fmt"
+ "log"
"os"
"testing"
@@ -31,6 +33,8 @@ var dirC string
func TestMain(m *testing.M) {
var r int
+ flag.Parse()
+
testcases := []struct {
plaintextnames bool
deterministic_names bool
@@ -40,23 +44,17 @@ func TestMain(m *testing.M) {
{false, true},
}
for i, tc := range testcases {
- argsA := []string{"-reverse"}
+ // Fill the global vars
plaintextnames, deterministic_names = tc.plaintextnames, tc.deterministic_names
- if tc.plaintextnames {
- argsA = append(argsA, "-plaintextnames")
- } else if tc.deterministic_names {
- argsA = append(argsA, "-deterministic-names")
+ if testing.Verbose() {
+ log.Printf("TestMain: plaintextnames=%v deterministic_names=%v", plaintextnames, deterministic_names)
}
- dirA = test_helpers.InitFS(nil, argsA...)
- dirB = test_helpers.TmpDir + "/b"
+
+ dirA, dirB, _ = newReverseFS(nil)
dirC = test_helpers.TmpDir + "/c"
- if err := os.Mkdir(dirB, 0700); err != nil {
- panic(err)
- }
if err := os.Mkdir(dirC, 0700); err != nil {
panic(err)
}
- test_helpers.MountOrExit(dirA, dirB, "-reverse", "-extpass", "echo test")
test_helpers.MountOrExit(dirB, dirC, "-extpass", "echo test")
r = m.Run()
test_helpers.UnmountPanic(dirC)
@@ -73,3 +71,24 @@ func TestMain(m *testing.M) {
}
os.Exit(r)
}
+
+// newReverseFS creates and mounts a new, empty reverse filesystem.
+func newReverseFS(extraMountArgs []string) (backingDir, mntDir, ctlsockPath string) {
+ args := []string{"-reverse"}
+ if plaintextnames {
+ args = append(args, "-plaintextnames")
+ } else if deterministic_names {
+ args = append(args, "-deterministic-names")
+ }
+ backingDir = test_helpers.InitFS(nil, args...)
+ mntDir = backingDir + ".mnt"
+ ctlsockPath = mntDir + ".sock"
+ mountArgs := []string{"-reverse", "-extpass", "echo test", "-ctlsock", ctlsockPath}
+ mountArgs = append(mountArgs, extraMountArgs...)
+ test_helpers.MountOrExit(backingDir, mntDir, mountArgs...)
+
+ if testing.Verbose() {
+ log.Printf("newReverseFS: mounted %q on %q", backingDir, mntDir)
+ }
+ return
+}
diff --git a/tests/reverse/one_file_system_test.go b/tests/reverse/one_file_system_test.go
index 61190ea..823cf62 100644
--- a/tests/reverse/one_file_system_test.go
+++ b/tests/reverse/one_file_system_test.go
@@ -1,7 +1,6 @@
package reverse_test
import (
- "io/ioutil"
"net/url"
"os"
"runtime"
@@ -17,7 +16,7 @@ func TestOneFileSystem(t *testing.T) {
}
// Let's not explode with "TempDir: pattern contains path separator"
myEscapedName := url.PathEscape(t.Name())
- mnt, err := ioutil.TempDir(test_helpers.TmpDir, myEscapedName)
+ mnt, err := os.MkdirTemp(test_helpers.TmpDir, myEscapedName)
if err != nil {
t.Fatal(err)
}
@@ -33,7 +32,7 @@ func TestOneFileSystem(t *testing.T) {
// Copied from inomap
const maxPassthruIno = 1<<48 - 1
- entries, err := ioutil.ReadDir(mnt)
+ entries, err := os.ReadDir(mnt)
if err != nil {
t.Fatal(err)
}
@@ -43,7 +42,11 @@ func TestOneFileSystem(t *testing.T) {
// We are only interested in directories
continue
}
- st := e.Sys().(*syscall.Stat_t)
+ info, err := e.Info()
+ if err != nil {
+ continue
+ }
+ st := info.Sys().(*syscall.Stat_t)
// The inode numbers of files with a different device number are remapped
// to something above maxPassthruIno
if st.Ino > maxPassthruIno {
diff --git a/tests/reverse/xattr_test.go b/tests/reverse/xattr_test.go
index 8002604..c70f623 100644
--- a/tests/reverse/xattr_test.go
+++ b/tests/reverse/xattr_test.go
@@ -2,7 +2,7 @@ package reverse_test
import (
"fmt"
- "io/ioutil"
+ "os"
"path/filepath"
"syscall"
"testing"
@@ -16,10 +16,7 @@ func xattrSupported(path string) bool {
return true
}
err2 := err.(*xattr.Error)
- if err2.Err == syscall.EOPNOTSUPP {
- return false
- }
- return true
+ return err2.Err != syscall.EOPNOTSUPP
}
func TestXattrList(t *testing.T) {
@@ -29,7 +26,7 @@ func TestXattrList(t *testing.T) {
t.Skip()
}
fnA := filepath.Join(dirA, t.Name())
- err := ioutil.WriteFile(fnA, nil, 0700)
+ err := os.WriteFile(fnA, nil, 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
diff --git a/tests/root_test/issue893_test.go b/tests/root_test/issue893_test.go
new file mode 100644
index 0000000..2db0b19
--- /dev/null
+++ b/tests/root_test/issue893_test.go
@@ -0,0 +1,98 @@
+//go:build linux
+
+package root_test
+
+import (
+ "fmt"
+ "os"
+ "sync"
+ "syscall"
+ "testing"
+ "time"
+
+ "github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
+)
+
+// gocryptfs v2.5.0 upgraded x/sys/unix and we found out that, since
+// https://github.com/golang/sys/commit/d0df966e6959f00dc1c74363e537872647352d51 ,
+// unix.Setreuid() and friends now affect the whole process instead of only the
+// current thread, breaking allow_other: https://github.com/rfjakob/gocryptfs/issues/893
+//
+// Let's not have this happen again by testing it here.
+func TestConcurrentUserOps(t *testing.T) {
+ if os.Getuid() != 0 {
+ t.Skip("must run as root")
+ }
+
+ var wg sync.WaitGroup
+
+ oneStressor := func(tid int) {
+ defer wg.Done()
+ err := asUser(10000+tid, 20000+tid, nil, func() (err error) {
+ for i := 0; i < 100; i++ {
+ d := fmt.Sprintf("%s/tid%d.i%d/foo/bar/baz", test_helpers.DefaultPlainDir, tid, i)
+ if err = os.MkdirAll(d, 0700); err != nil {
+ return
+ }
+ if err = os.WriteFile(d+"/foo", nil, 0400); err != nil {
+ return
+ }
+ if err = os.WriteFile(d+"/bar", []byte("aaaaaaaaaaaaaaaaaaaaa"), 0400); err != nil {
+ return
+ }
+ if err = syscall.Unlink(d + "/foo"); err != nil {
+ return
+ }
+ if err = os.Mkdir(d+"/foo", 0700); err != nil {
+ return
+ }
+ }
+ return nil
+ })
+ if err != nil {
+ t.Error(err)
+ }
+ }
+
+ threads := 4
+ wg.Add(threads)
+ for tid := 0; tid < threads; tid++ {
+ go oneStressor(tid)
+ }
+ wg.Wait()
+}
+
+// Test that our root_test.asUser function works as expected under concurrency by
+// similating a long-runnig operation with sleep(10ms).
+// https://github.com/rfjakob/gocryptfs/issues/893
+func TestAsUserSleep(t *testing.T) {
+ if os.Getuid() != 0 {
+ t.Skip("must run as root")
+ }
+
+ var wg sync.WaitGroup
+ f := func(euid_want int) error {
+ euid_have := syscall.Geteuid()
+ if euid_want != euid_have {
+ return fmt.Errorf("wrong euid: want=%d have=%d", euid_want, euid_have)
+ }
+ time.Sleep(10 * time.Millisecond)
+ euid_have2 := syscall.Geteuid()
+ if euid_want != euid_have2 {
+ return fmt.Errorf("wrong euid: want=%d have2=%d", euid_want, euid_have2)
+ }
+ return nil
+ }
+ threads := 100
+ wg.Add(threads)
+ for i := 0; i < threads; i++ {
+ go func(i int) {
+ defer wg.Done()
+ err := asUser(10000+i, 20000+i, nil, func() error { return f(10000 + i) })
+ if err != nil {
+ t.Error(err)
+ }
+ }(i)
+ }
+ wg.Wait()
+}
diff --git a/tests/root_test/main_test.go b/tests/root_test/main_test.go
new file mode 100644
index 0000000..d6d5cc4
--- /dev/null
+++ b/tests/root_test/main_test.go
@@ -0,0 +1,20 @@
+//go:build linux
+
+package root_test
+
+import (
+ "os"
+ "testing"
+
+ "github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
+)
+
+func TestMain(m *testing.M) {
+ test_helpers.ResetTmpDir(true)
+ os.Chmod(test_helpers.DefaultCipherDir, 0777)
+ test_helpers.MountOrExit(test_helpers.DefaultCipherDir, test_helpers.DefaultPlainDir, "-zerokey", "-allow_other")
+ r := m.Run()
+ test_helpers.UnmountPanic(test_helpers.DefaultPlainDir)
+ os.RemoveAll(test_helpers.TmpDir)
+ os.Exit(r)
+}
diff --git a/tests/root_test/root_test.go b/tests/root_test/root_test.go
index 23b44d0..7bc3ebc 100644
--- a/tests/root_test/root_test.go
+++ b/tests/root_test/root_test.go
@@ -1,12 +1,10 @@
//go:build linux
-// +build linux
// Package root_test contains tests that need root
// permissions to run
package root_test
import (
- "io/ioutil"
"os"
"os/exec"
"path/filepath"
@@ -17,8 +15,6 @@ import (
"github.com/rfjakob/gocryptfs/v2/internal/syscallcompat"
- "golang.org/x/sys/unix"
-
"github.com/rfjakob/gocryptfs/v2/tests/test_helpers"
)
@@ -26,36 +22,23 @@ func asUser(uid int, gid int, supplementaryGroups []int, f func() error) error {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- err := unix.Setgroups(supplementaryGroups)
+ err := syscallcompat.Setgroups(supplementaryGroups)
if err != nil {
return err
}
- defer func() {
- err = unix.Setgroups(nil)
- if err != nil {
- panic(err)
- }
- }()
- err = unix.Setregid(-1, gid)
+ defer syscallcompat.SetgroupsPanic(nil)
+
+ err = syscallcompat.Setregid(-1, gid)
if err != nil {
return err
}
- defer func() {
- err = unix.Setregid(-1, 0)
- if err != nil {
- panic(err)
- }
- }()
- err = unix.Setreuid(-1, uid)
+ defer syscallcompat.SetregidPanic(-1, 0)
+
+ err = syscallcompat.Setreuid(-1, uid)
if err != nil {
return err
}
- defer func() {
- err = unix.Setreuid(-1, 0)
- if err != nil {
- panic(err)
- }
- }()
+ defer syscallcompat.SetreuidPanic(-1, 0)
ret := f()
@@ -67,13 +50,13 @@ func asUser(uid int, gid int, supplementaryGroups []int, f func() error) error {
//
// How to check:
// ps -o tid,pid,euid,ruid,suid,egid,rgid,sgid,cmd -eL
- err = unix.Setresuid(0, 0, 0)
- if err != nil {
- panic(err)
+ _, _, errno := syscall.RawSyscall(syscall.SYS_SETRESUID, uintptr(0), uintptr(0), uintptr(0))
+ if errno != 0 {
+ panic(errno)
}
- err = unix.Setresgid(0, 0, 0)
- if err != nil {
- panic(err)
+ _, _, errno = syscall.RawSyscall(syscall.SYS_SETRESGID, uintptr(0), uintptr(0), uintptr(0))
+ if errno != 0 {
+ panic(errno)
}
return ret
@@ -83,16 +66,11 @@ func TestSupplementaryGroups(t *testing.T) {
if os.Getuid() != 0 {
t.Skip("must run as root")
}
- cDir := test_helpers.InitFS(t)
- os.Chmod(cDir, 0755)
- pDir := cDir + ".mnt"
- test_helpers.MountOrFatal(t, cDir, pDir, "-allow_other", "-extpass=echo test")
- defer test_helpers.UnmountPanic(pDir)
// We need an unrestricted umask
syscall.Umask(0000)
- dir1 := pDir + "/dir1"
+ dir1 := test_helpers.DefaultPlainDir + "/dir1"
err := os.Mkdir(dir1, 0770)
if err != nil {
t.Fatal(err)
@@ -224,7 +202,7 @@ func TestDiskFull(t *testing.T) {
}
t.Logf("sz1=%d, sz2=%d", sz1, sz2)
- foo1, err := ioutil.ReadFile(mnt + "/foo1")
+ foo1, err := os.ReadFile(mnt + "/foo1")
if err != nil {
t.Fatal(err)
}
@@ -232,7 +210,7 @@ func TestDiskFull(t *testing.T) {
t.Fail()
}
- foo2, err := ioutil.ReadFile(mnt + "/foo2")
+ foo2, err := os.ReadFile(mnt + "/foo2")
if err != nil {
t.Fatal(err)
}
@@ -252,7 +230,7 @@ func TestAcl(t *testing.T) {
defer test_helpers.UnmountPanic(pDir)
f1 := pDir + "/f1"
- if err := ioutil.WriteFile(f1, []byte("hello world\n"), 000); err != nil {
+ if err := os.WriteFile(f1, []byte("hello world\n"), 000); err != nil {
t.Fatal(err)
}
@@ -400,3 +378,39 @@ func TestOverlay(t *testing.T) {
}
defer syscall.Unmount(ovlMnt, 0)
}
+
+// Check that mkdir and file create works with force_owner and runnung as root
+// https://github.com/rfjakob/gocryptfs/issues/783
+func TestRootForceOwner(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", "-force_owner=1234:1234")
+ defer test_helpers.UnmountPanic(pDir)
+
+ err := asUser(1234, 1234, nil, func() error {
+ return os.Mkdir(pDir+"/dir1", 0700)
+ })
+ if err != nil {
+ t.Error(err)
+ }
+ err = asUser(1234, 1234, nil, func() error {
+ f, err := os.Create(pDir + "/file1")
+ if err == nil {
+ f.Close()
+ }
+ return err
+ })
+ if err != nil {
+ t.Error(err)
+ }
+ err = asUser(1234, 1234, nil, func() error {
+ sock := pDir + "/sock"
+ return syscall.Mknod(sock, syscall.S_IFSOCK|0600, 0)
+ })
+ if err != nil {
+ t.Errorf("mknod: %v", err)
+ }
+}
diff --git a/tests/stress_tests/fsstress-gocryptfs.bash b/tests/stress_tests/fsstress-gocryptfs.bash
index 30ea456..e6c3281 100755
--- a/tests/stress_tests/fsstress-gocryptfs.bash
+++ b/tests/stress_tests/fsstress-gocryptfs.bash
@@ -27,11 +27,11 @@ MYNAME=$(basename "$0")
source ../fuse-unmount.bash
# fsstress binary
-FSSTRESS=/opt/fuse-xfstests/ltp/fsstress
+FSSTRESS=/var/lib/xfstests/ltp/fsstress
if [[ ! -x $FSSTRESS ]]
then
echo "$MYNAME: fsstress binary not found at $FSSTRESS"
- echo "Please clone and compile https://github.com/rfjakob/fuse-xfstests"
+ echo "Please build and \"sudo make install\" git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git"
exit 1
fi
@@ -62,9 +62,8 @@ if [[ $MYNAME = fsstress-loopback.bash ]]; then
$GOPATH/bin/loopback $OPTS "$MNT" "$DIR" &
disown
elif [[ $MYNAME = fsstress-gocryptfs.bash ]]; then
- echo "Recompile gocryptfs"
- cd "$GOPATH/src/github.com/rfjakob/gocryptfs"
- ./build.bash # also prints the version
+ echo "$MYNAME: using gocryptfs at $GOPATH/bin/gocryptfs"
+ $GOPATH/bin/gocryptfs --version
$GOPATH/bin/gocryptfs -q -init -extpass "echo test" -scryptn=10 "$DIR"
$GOPATH/bin/gocryptfs -q -extpass "echo test" -nosyslog -fusedebug="$DEBUG" "$DIR" "$MNT"
elif [[ $MYNAME = fsstress-encfs.bash ]]; then
@@ -84,7 +83,7 @@ done
echo " ok: $MNT"
# Cleanup trap
-trap "kill %1 ; cd / ; fuse-unmount -z $MNT ; rm -rf $DIR $MNT" EXIT
+trap "echo ' cleaning up...' ; kill %1 ; cd / ; fuse-unmount -z $MNT ; rm -rf $DIR $MNT" EXIT
echo "Starting fsstress loop"
N=1
diff --git a/tests/stress_tests/parallel_cp.sh b/tests/stress_tests/parallel_cp.sh
index cd08d31..f113248 100755
--- a/tests/stress_tests/parallel_cp.sh
+++ b/tests/stress_tests/parallel_cp.sh
@@ -2,15 +2,16 @@
#
# Simplified xfstests generic/273
#
-# Fails with
+# Used to fail with
#
# cp: cannot create regular file 'sub_49/file_773': No such file or directory
#
# If you cannot reproduce, try running this in the background:
#
-# while sleep 0.1 ; do echo 3 > /proc/sys/vm/drop_caches ; done"
+# while sleep 0.1 ; do echo 3 > /proc/sys/vm/drop_caches ; done
#
# See https://github.com/rfjakob/gocryptfs/issues/322 for details.
+# Fixed by https://github.com/hanwen/go-fuse/commit/d0fca860a5759d17592becfa1b8e5b1bd354b24a .
if [[ -z $TMPDIR ]]; then
TMPDIR=/var/tmp
@@ -24,6 +25,9 @@ source ../fuse-unmount.bash
# Set the GOPATH variable to the default if it is empty
GOPATH=$(go env GOPATH)
+echo "$MYNAME: using gocryptfs at $GOPATH/bin/gocryptfs"
+$GOPATH/bin/gocryptfs --version
+
# Backing directory
DIR=$(mktemp -d "$TMPDIR/$MYNAME.XXX")
$GOPATH/bin/gocryptfs -q -init -extpass "echo test" -scryptn=10 "$DIR"
diff --git a/tests/stress_tests/pingpong.bash b/tests/stress_tests/pingpong.bash
index 4b8346e..d0d21b3 100755
--- a/tests/stress_tests/pingpong.bash
+++ b/tests/stress_tests/pingpong.bash
@@ -1,7 +1,8 @@
#!/bin/bash
#
# Mounts two gocryptfs filesystems, "ping" and "pong" and moves the
-# linux-3.0 kernel tree back and forth between them.
+# linux-3.0 kernel tree back and forth between them, checking integrity
+# using md5sum.
#
# When called as "pingpong-rsync.bash" it uses "rsync --remove-source-files"
# for moving the files, otherwise plain "mv".
@@ -29,6 +30,9 @@ mkdir "$PING.mnt" "$PONG.mnt"
# Just ignore unmount errors.
trap "set +e ; cd /tmp; fuse-unmount -z $PING.mnt ; fuse-unmount -z $PONG.mnt ; rm -rf $PING $PONG $PING.mnt $PONG.mnt" EXIT
+echo "$MYNAME: using gocryptfs at $(command -v gocryptfs)"
+gocryptfs --version
+
gocryptfs -q -init -extpass="echo test" -scryptn=10 "$PING"
gocryptfs -q -init -extpass="echo test" -scryptn=10 "$PONG"
diff --git a/tests/test_helpers/helpers.go b/tests/test_helpers/helpers.go
index 0d21548..c8cd151 100644
--- a/tests/test_helpers/helpers.go
+++ b/tests/test_helpers/helpers.go
@@ -5,7 +5,6 @@ import (
"crypto/md5"
"encoding/hex"
"fmt"
- "io/ioutil"
"log"
"os"
"os/exec"
@@ -55,7 +54,7 @@ func doInit() {
fmt.Printf("test_helpers: warning: testParentDir %q does not reside on ext4, we will miss failures caused by ino reuse\n", testParentDir)
}
var err error
- TmpDir, err = ioutil.TempDir(testParentDir, "")
+ TmpDir, err = os.MkdirTemp(testParentDir, "")
if err != nil {
panic(err)
}
@@ -73,7 +72,7 @@ func doInit() {
// *-- gocryptfs.diriv
func ResetTmpDir(createDirIV bool) {
// Try to unmount and delete everything
- entries, err := ioutil.ReadDir(TmpDir)
+ entries, err := os.ReadDir(TmpDir)
if err == nil {
for _, e := range entries {
d := filepath.Join(TmpDir, e.Name())
@@ -148,7 +147,7 @@ func InitFS(t *testing.T, extraArgs ...string) string {
if t != nil {
prefix = t.Name() + "."
}
- dir, err := ioutil.TempDir(TmpDir, prefix)
+ dir, err := os.MkdirTemp(TmpDir, prefix)
if err != nil {
if t != nil {
t.Fatal(err)
@@ -178,7 +177,7 @@ func InitFS(t *testing.T, extraArgs ...string) string {
// Md5fn returns an md5 string for file "filename"
func Md5fn(filename string) string {
- buf, err := ioutil.ReadFile(filename)
+ buf, err := os.ReadFile(filename)
if err != nil {
fmt.Printf("ReadFile: %v\n", err)
return ""
@@ -199,7 +198,7 @@ func Md5hex(buf []byte) string {
// 3) Size reported by Fstat()
func VerifySize(t *testing.T, path string, want int) {
// Read whole file
- buf, err := ioutil.ReadFile(path)
+ buf, err := os.ReadFile(path)
if err != nil {
t.Errorf("ReadFile failed: %v", err)
} else if len(buf) != want {
@@ -299,7 +298,7 @@ func TestMkdirRmdir(t *testing.T, plainDir string) {
func TestRename(t *testing.T, plainDir string) {
file1 := plainDir + "/rename1"
file2 := plainDir + "/rename2"
- err := ioutil.WriteFile(file1, []byte("content"), 0777)
+ err := os.WriteFile(file1, []byte("content"), 0777)
if err != nil {
t.Error(err)
return
diff --git a/tests/test_helpers/mount_unmount.go b/tests/test_helpers/mount_unmount.go
index afd33f1..4abc432 100644
--- a/tests/test_helpers/mount_unmount.go
+++ b/tests/test_helpers/mount_unmount.go
@@ -187,7 +187,7 @@ func UnmountErr(dir string) (err error) {
err = cmd.Run()
if err == nil {
if len(fdsNow) > len(fds)+maxCacheFds {
- return fmt.Errorf("fd leak in gocryptfs process? pid=%d dir=%q, fds:\nold=%v \nnew=%v\n", pid, dir, fds, fdsNow)
+ return fmt.Errorf("fd leak in gocryptfs process? pid=%d dir=%q, fds:\nold=%v \nnew=%v", pid, dir, fds, fdsNow)
}
return nil
}
@@ -242,11 +242,12 @@ func ListFds(pid int, prefix string) []string {
// fd was closed in the meantime
continue
}
- if strings.HasPrefix(target, "pipe:") || strings.HasPrefix(target, "anon_inode:[eventpoll]") {
+ if strings.HasPrefix(target, "pipe:") || strings.HasPrefix(target, "anon_inode:[eventpoll]") ||
+ strings.HasPrefix(target, "anon_inode:[pidfd]") {
// The Go runtime creates pipes on demand for splice(), which
// creates spurious test failures. Ignore all pipes.
- // Also get rid of the "eventpoll" fd that is always there and not
- // interesting.
+ // Also get rid of the "eventpoll" and "pidfd" fds that are always there
+ // and not interesting.
filtered = append(filtered, target)
continue
}
diff --git a/tests/xattr/xattr_fd_test.go b/tests/xattr/xattr_fd_test.go
index f3586cf..ae53afc 100644
--- a/tests/xattr/xattr_fd_test.go
+++ b/tests/xattr/xattr_fd_test.go
@@ -6,7 +6,7 @@
package xattr_tests
import (
- "io/ioutil"
+ "os"
"syscall"
"testing"
@@ -18,7 +18,7 @@ import (
func TestFdXattr(t *testing.T) {
attr := "user.foo"
fn := test_helpers.DefaultPlainDir + "/TestFdXattr"
- err := ioutil.WriteFile(fn, nil, 0700)
+ err := os.WriteFile(fn, nil, 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
diff --git a/tests/xattr/xattr_integration_test.go b/tests/xattr/xattr_integration_test.go
index c968a47..e662828 100644
--- a/tests/xattr/xattr_integration_test.go
+++ b/tests/xattr/xattr_integration_test.go
@@ -10,7 +10,6 @@ import (
"bytes"
"encoding/base64"
"fmt"
- "io/ioutil"
"os"
"strings"
"syscall"
@@ -31,7 +30,7 @@ func TestMain(m *testing.M) {
// Write deterministic diriv so encrypted filenames are deterministic.
os.Remove(test_helpers.DefaultCipherDir + "/gocryptfs.diriv")
diriv := []byte("1234567890123456")
- err := ioutil.WriteFile(test_helpers.DefaultCipherDir+"/gocryptfs.diriv", diriv, 0400)
+ err := os.WriteFile(test_helpers.DefaultCipherDir+"/gocryptfs.diriv", diriv, 0400)
if err != nil {
fmt.Println(err)
os.Exit(1)
@@ -92,7 +91,7 @@ func setGetRmList3(fn string, attr string, val []byte) error {
// Test xattr set, get, rm on a regular file.
func TestSetGetRmRegularFile(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestSetGetRmRegularFile"
- err := ioutil.WriteFile(fn, []byte("12345"), 0700)
+ err := os.WriteFile(fn, []byte("12345"), 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -132,7 +131,7 @@ func TestSetGetRmDir(t *testing.T) {
func TestXattrSetEmpty(t *testing.T) {
attr := "user.foo"
fn := test_helpers.DefaultPlainDir + "/TestXattrSetEmpty1"
- err := ioutil.WriteFile(fn, nil, 0700)
+ err := os.WriteFile(fn, nil, 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -185,7 +184,7 @@ func TestXattrSetEmpty(t *testing.T) {
func TestXattrList(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestXattrList"
- err := ioutil.WriteFile(fn, nil, 0700)
+ err := os.WriteFile(fn, nil, 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -218,10 +217,7 @@ func xattrSupported(path string) bool {
return true
}
err2 := err.(*xattr.Error)
- if err2.Err == syscall.EOPNOTSUPP {
- return false
- }
- return true
+ return err2.Err != syscall.EOPNOTSUPP
}
func TestBase64XattrRead(t *testing.T) {
@@ -236,7 +232,7 @@ func TestBase64XattrRead(t *testing.T) {
plainFn := test_helpers.DefaultPlainDir + "/" + fileName
encryptedFn := test_helpers.DefaultCipherDir + "/" + encryptedFileName
- err := ioutil.WriteFile(plainFn, nil, 0700)
+ err := os.WriteFile(plainFn, nil, 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -289,7 +285,7 @@ func TestBase64XattrRead(t *testing.T) {
// Listing xattrs should work even when we don't have read access
func TestList0000File(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestList0000File"
- err := ioutil.WriteFile(fn, nil, 0000)
+ err := os.WriteFile(fn, nil, 0000)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -302,7 +298,7 @@ func TestList0000File(t *testing.T) {
// Setting xattrs should work even when we don't have read access
func TestSet0200File(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestSet0200File"
- err := ioutil.WriteFile(fn, nil, 0200)
+ err := os.WriteFile(fn, nil, 0200)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -342,7 +338,7 @@ func TestSet0200Dir(t *testing.T) {
func TestAcl(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/TestAcl"
- err := ioutil.WriteFile(fn, nil, 0600)
+ err := os.WriteFile(fn, nil, 0600)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}
@@ -374,7 +370,7 @@ func TestAcl(t *testing.T) {
// https://github.com/rfjakob/gocryptfs/issues/627
func TestSlashInName(t *testing.T) {
fn := test_helpers.DefaultPlainDir + "/" + t.Name()
- err := ioutil.WriteFile(fn, []byte("12345"), 0700)
+ err := os.WriteFile(fn, []byte("12345"), 0700)
if err != nil {
t.Fatalf("creating empty file failed: %v", err)
}