From 9f56b33e0c8701085189aa77463f1b471b70a705 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 25 Nov 2017 01:56:56 +0100 Subject: fusefrontend: Fix longname handling for renames with existing target Fixes https://github.com/rfjakob/gocryptfs/issues/170 Steps to reproduce the problem: * Create a regular forward mount point * Create a file with a shortname and one with a long filename * Try to run 'mv ' This should actually work and replace the existing file, but instead it fails with: mv: cannot move '' to '': File exists The problem is the creation of the .name file. If the target already exists we can safely ignore the EEXIST error and just keep the existing .name file. --- tests/matrix/matrix_test.go | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'tests/matrix') diff --git a/tests/matrix/matrix_test.go b/tests/matrix/matrix_test.go index 88c255e..9b9cb1b 100644 --- a/tests/matrix/matrix_test.go +++ b/tests/matrix/matrix_test.go @@ -544,7 +544,7 @@ func TestLongNames(t *testing.T) { if !test_helpers.VerifyExistence(wd + n255x) { t.Errorf("n255x is not in directory listing") } - // Rename long to long + // Rename long to long (target does not exist) n255y := string(bytes.Repeat([]byte("y"), 255)) err = os.Rename(wd+n255x, wd+n255y) if err != nil { @@ -553,7 +553,20 @@ func TestLongNames(t *testing.T) { if !test_helpers.VerifyExistence(wd + n255y) { t.Errorf("n255y is not in directory listing") } - // Rename long to short + // Rename long to long (target exists) + f, err = os.Create(wd + n255x) + if err != nil { + t.Fatalf("Could not create n255x: %v", err) + } + f.Close() + err = os.Rename(wd+n255x, wd+n255y) + if err != nil { + t.Fatalf("Could not rename n255x to n255y: %v", err) + } + if !test_helpers.VerifyExistence(wd + n255y) { + t.Errorf("n255y is not in directory listing") + } + // Rename long to short (target does not exist) err = os.Rename(wd+n255y, wd+"short") if err != nil { t.Fatalf("Could not rename n255y to short: %v", err) @@ -561,7 +574,20 @@ func TestLongNames(t *testing.T) { if !test_helpers.VerifyExistence(wd + "short") { t.Errorf("short is not in directory listing") } - // Rename short to long + // Rename long to short (target exists) + f, err = os.Create(wd + n255y) + if err != nil { + t.Fatalf("Could not create n255y: %v", err) + } + f.Close() + err = os.Rename(wd+n255y, wd+"short") + if err != nil { + t.Fatalf("Could not rename n255y to short: %v", err) + } + if !test_helpers.VerifyExistence(wd + "short") { + t.Errorf("short is not in directory listing") + } + // Rename short to long (target does not exist) err = os.Rename(wd+"short", wd+n255x) if err != nil { t.Fatalf("Could not rename short to n255x: %v", err) @@ -569,6 +595,19 @@ func TestLongNames(t *testing.T) { if !test_helpers.VerifyExistence(wd + n255x) { t.Errorf("255x is not in directory listing II") } + // Rename short to long (target exists) + f, err = os.Create(wd + "short") + if err != nil { + t.Fatalf("Could not create short: %v", err) + } + f.Close() + err = os.Rename(wd+"short", wd+n255x) + if err != nil { + t.Fatalf("Could not rename short to n255x: %v", err) + } + if !test_helpers.VerifyExistence(wd + n255x) { + t.Errorf("n255x is not in directory listing") + } // Unlink err = syscall.Unlink(wd + n255x) if err != nil { -- cgit v1.2.3