diff options
| author | Jakob Unterwurzacher | 2024-05-01 22:24:24 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2024-05-01 22:24:24 +0200 | 
| commit | 210c5c512a7e363d1ada9de2b405463166ec940a (patch) | |
| tree | e9a0e6496aac60e773f147c9fd80aa61cfaecfff | |
| parent | 1b3fb29ba4d05cc3863c1fe1a76c591a0982fc22 (diff) | |
tetss: reverse: add TestHardlinkedLongname
Regression test for https://github.com/rfjakob/gocryptfs/issues/802 .
Fails at the moment.
| -rw-r--r-- | tests/reverse/correctness_test.go | 60 | 
1 files changed, 60 insertions, 0 deletions
| diff --git a/tests/reverse/correctness_test.go b/tests/reverse/correctness_test.go index 4a5224c..8747a11 100644 --- a/tests/reverse/correctness_test.go +++ b/tests/reverse/correctness_test.go @@ -4,8 +4,10 @@ import (  	"bytes"  	"fmt"  	"io/ioutil" +	"log"  	"os"  	"path/filepath" +	"strings"  	"syscall"  	"testing" @@ -293,3 +295,61 @@ func TestSeekData(t *testing.T) {  	}  	f.Close()  } + +func findInum(dir string, inum uint64) (name string) { +	entries, err := os.ReadDir(dir) +	if err != nil { +		panic(err) +	} +	for _, e := range entries { +		info, _ := e.Info() +		st := info.Sys().(*syscall.Stat_t) +		if st.Ino == inum { +			return dir + "/" + e.Name() +		} +	} +	log.Panicf("inum %d not found", inum) +	return "" +} + +// gocryptfs.longname.*.name of hardlinked files should not appear hardlinked (as the +// contents are different). +// +// https://github.com/rfjakob/gocryptfs/issues/802 +func TestHardlinkedLongname(t *testing.T) { +	if plaintextnames { +		t.Skip() +	} + +	workdir := dirA + "/" + t.Name() +	if err := os.Mkdir(workdir, 0700); err != nil { +		t.Fatal(err) +	} +	long1 := workdir + "/" + strings.Repeat("x", 200) +	if err := ioutil.WriteFile(long1, []byte("hello"), 0600); err != nil { +		t.Fatal(err) +	} +	long2 := workdir + "/" + 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 := findInum(dirB, st.Ino) +	t.Logf("workdir=%q cWorkdir=%q", workdir, cWorkdir) + +	matches, err := filepath.Glob(cWorkdir + "/gocryptfs.longname.*.name") +	if err != nil { +		t.Fatal(err) +	} +	if len(matches) != 2 { +		t.Fatalf("BUG: only %d matches, want 2", len(matches)) +	} +	if test_helpers.Md5fn(matches[0]) == test_helpers.Md5fn(matches[1]) { +		t.Errorf("Files %q are identical - that's wrong!", matches) +	} +} | 
