diff options
author | Jakob Unterwurzacher | 2016-11-10 23:25:37 +0100 |
---|---|---|
committer | Jakob Unterwurzacher | 2016-11-10 23:30:30 +0100 |
commit | d3764b775395faa31afb1db34c5c2814a0e9af09 (patch) | |
tree | c95c8e28754eb2760963532f5694c17bc1bb3b45 /internal | |
parent | e7f57695a6c7b3ed545793347506907c7aec3ecc (diff) |
reverse: fix longname decoding bug
This could have caused spurious ENOENT errors.
That it did not cause these errors all the time is interesting
and probably because an earlier readdir would place the entry
in the cache. This masks the bug.
Diffstat (limited to 'internal')
-rw-r--r-- | internal/fusefrontend_reverse/reverse_longnames.go | 2 | ||||
-rw-r--r-- | internal/fusefrontend_reverse/rpath.go | 7 |
2 files changed, 6 insertions, 3 deletions
diff --git a/internal/fusefrontend_reverse/reverse_longnames.go b/internal/fusefrontend_reverse/reverse_longnames.go index 96fa613..0234397 100644 --- a/internal/fusefrontend_reverse/reverse_longnames.go +++ b/internal/fusefrontend_reverse/reverse_longnames.go @@ -11,6 +11,7 @@ import ( "github.com/hanwen/go-fuse/fuse/nodefs" "github.com/rfjakob/gocryptfs/internal/nametransform" + "github.com/rfjakob/gocryptfs/internal/tlog" ) const ( @@ -49,6 +50,7 @@ func (rfs *ReverseFS) findLongnameParent(dir string, dirIV []byte, longname stri absDir := filepath.Join(rfs.args.Cipherdir, dir) dirfd, err := os.Open(absDir) if err != nil { + tlog.Warn.Printf("findLongnameParent: opendir failed: %v\n", err) return "", err } dirEntries, err := dirfd.Readdirnames(-1) diff --git a/internal/fusefrontend_reverse/rpath.go b/internal/fusefrontend_reverse/rpath.go index 2740104..0da40bb 100644 --- a/internal/fusefrontend_reverse/rpath.go +++ b/internal/fusefrontend_reverse/rpath.go @@ -52,9 +52,9 @@ func (rfs *ReverseFS) decryptPath(relPath string) (string, error) { parts := strings.Split(relPath, "/") for i, part := range parts { // Start at the top and recurse - currentDir := filepath.Join(parts[:i]...) + currentCipherDir := filepath.Join(parts[:i]...) nameType := nametransform.NameType(part) - dirIV := derivePathIV(currentDir, ivPurposeDirIV) + dirIV := derivePathIV(currentCipherDir, ivPurposeDirIV) var transformedPart string if nameType == nametransform.LongNameNone { transformedPart, err = rfs.nameTransform.DecryptName(part, dirIV) @@ -74,7 +74,8 @@ func (rfs *ReverseFS) decryptPath(relPath string) (string, error) { return "", err } } else if nameType == nametransform.LongNameContent { - transformedPart, err = rfs.findLongnameParent(currentDir, dirIV, part) + currentPlainDir := filepath.Join(transformedParts[:i]...) + transformedPart, err = rfs.findLongnameParent(currentPlainDir, dirIV, part) if err != nil { return "", err } |