From 6a9c49e9cf23c85622dd4b181cdc615abc72d6bb Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sat, 12 Sep 2020 17:54:55 +0200 Subject: [PATCH] tests/plaintextnames: add TestInoReuseEvil --- tests/plaintextnames/plaintextnames_test.go | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) 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) + } +}