diff options
author | Sebastian Lackner | 2017-11-25 01:56:56 +0100 |
---|---|---|
committer | rfjakob | 2017-11-25 16:19:09 +0100 |
commit | 9f56b33e0c8701085189aa77463f1b471b70a705 (patch) | |
tree | 924753e68c55dec84048c58678eb90f9361f3ea6 /internal/fusefrontend | |
parent | d257bb34c1dd478cdb62c0d19c3e280d4f8649b4 (diff) |
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 <shortname> <longname>'
This should actually work and replace the existing file, but instead it
fails with:
mv: cannot move '<shortname>' to '<longname>': 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.
Diffstat (limited to 'internal/fusefrontend')
-rw-r--r-- | internal/fusefrontend/fs.go | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 3c442a5..b4819fd 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -517,7 +517,13 @@ func (fs *FS) Rename(oldPath string, newPath string, context *fuse.Context) (cod finalNewPath = cNewName // Create destination .name file err = fs.nameTransform.WriteLongName(newDirFd, cNewName, newPath) - if err != nil { + // Failure to write the .name file is expected when the target path already + // exists. Since hashes are pretty unique, there is no need to modify the + // file anyway. We still set newDirFd to nil to ensure that we do not delete + // the file on error. + if err == syscall.EEXIST { + newDirFd = nil + } else if err != nil { return fuse.ToStatus(err) } } |