diff options
author | Jakob Unterwurzacher | 2020-09-12 17:54:55 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2020-09-12 17:55:37 +0200 |
commit | 6a9c49e9cf23c85622dd4b181cdc615abc72d6bb (patch) | |
tree | 8bd1a43365ca21a2c97926987dc60ae18edc6920 /tests | |
parent | db61ec5115f6d2ae0e9dfcf2b87163221a969f6b (diff) |
tests/plaintextnames: add TestInoReuseEvil
Diffstat (limited to 'tests')
-rw-r--r-- | tests/plaintextnames/plaintextnames_test.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/plaintextnames/plaintextnames_test.go b/tests/plaintextnames/plaintextnames_test.go index cce25b6..2977deb 100644 --- a/tests/plaintextnames/plaintextnames_test.go +++ b/tests/plaintextnames/plaintextnames_test.go @@ -3,8 +3,10 @@ package plaintextnames // integration tests that target plaintextnames specifically import ( + "fmt" "io/ioutil" "os" + "syscall" "testing" "github.com/rfjakob/gocryptfs/internal/configfile" @@ -84,3 +86,42 @@ func TestFiltered(t *testing.T) { fd.Close() } } + +// TestInoReuseEvil makes it appear that a directory and a file share the +// same inode number. +// Only works on filesystems that recycle inode numbers (ext4 does), +// and then the test causes a hang with these messages: +// +// go-fuse: blocked for 5 seconds waiting for FORGET on i4329366 +// go-fuse: blocked for 11 seconds waiting for FORGET on i4329366 +// go-fuse: blocked for 17 seconds waiting for FORGET on i4329366 +// [...] +// +func TestInoReuseEvil(t *testing.T) { + t.Skip("TODO: enable this test once the problem is fixed in go-fuse") + + for i := 0; i < 2; i++ { + n := fmt.Sprintf("%s.%d", t.Name(), i) + pPath := pDir + "/" + n + cPath := cDir + "/" + n + if err := syscall.Mkdir(pPath, 0700); err != nil { + t.Fatal(err) + } + var st syscall.Stat_t + syscall.Stat(pPath, &st) + t.Logf("dir ino = %d", st.Ino) + // delete the dir "behind our back" + if err := syscall.Rmdir(cPath); err != nil { + t.Fatal(err) + } + // create a new file that will likely get the same inode number + pPath2 := pPath + "2" + fd, err := syscall.Creat(pPath2, 0600) + if err != nil { + t.Fatal(err) + } + defer syscall.Close(fd) + syscall.Fstat(fd, &st) + t.Logf("file ino = %d", st.Ino) + } +} |