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  			} | 
