diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index bb8e1cf6..a77eae0d 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -278,17 +278,12 @@ func (fs *FS) Mknod(path string, mode uint32, dev uint32, context *fuse.Context) if fs.isFiltered(path) { return fuse.EPERM } - cPath, err := fs.getBackingPath(path) - if err != nil { - return fuse.ToStatus(err) - } - dirfd, err := os.Open(filepath.Dir(cPath)) + dirfd, cName, err := fs.openBackingPath(path) if err != nil { return fuse.ToStatus(err) } defer dirfd.Close() // Create ".name" file to store long file name (except in PlaintextNames mode) - cName := filepath.Base(cPath) if !fs.args.PlaintextNames && nametransform.IsLongContent(cName) { err = fs.nameTransform.WriteLongName(dirfd, cName, path) if err != nil { @@ -423,11 +418,7 @@ func (fs *FS) Symlink(target string, linkName string, context *fuse.Context) (co if fs.isFiltered(linkName) { return fuse.EPERM } - cPath, err := fs.getBackingPath(linkName) - if err != nil { - return fuse.ToStatus(err) - } - dirfd, err := os.Open(filepath.Dir(cPath)) + dirfd, cName, err := fs.openBackingPath(linkName) if err != nil { return fuse.ToStatus(err) } @@ -439,7 +430,6 @@ func (fs *FS) Symlink(target string, linkName string, context *fuse.Context) (co cTarget = fs.nameTransform.B64.EncodeToString(cBinTarget) } // Create ".name" file to store long file name (except in PlaintextNames mode) - cName := filepath.Base(cPath) if !fs.args.PlaintextNames && nametransform.IsLongContent(cName) { err = fs.nameTransform.WriteLongName(dirfd, cName, linkName) if err != nil { diff --git a/internal/fusefrontend/names.go b/internal/fusefrontend/names.go index 38334798..9be2623f 100644 --- a/internal/fusefrontend/names.go +++ b/internal/fusefrontend/names.go @@ -3,6 +3,7 @@ package fusefrontend // This file forwards file encryption operations to cryptfs import ( + "os" "path/filepath" "github.com/rfjakob/gocryptfs/internal/configfile" @@ -39,6 +40,20 @@ func (fs *FS) getBackingPath(relPath string) (string, error) { return cAbsPath, nil } +// openBackingPath - get the absolute encrypted path of the backing file +// and open the corresponding directory +func (fs *FS) openBackingPath(relPath string) (*os.File, string, error) { + cPath, err := fs.getBackingPath(relPath) + if err != nil { + return nil, "", err + } + dirfd, err := os.Open(filepath.Dir(cPath)) + if err != nil { + return nil, "", err + } + return dirfd, filepath.Base(cPath), nil +} + // encryptPath - encrypt relative plaintext path func (fs *FS) encryptPath(plainPath string) (string, error) { if fs.args.PlaintextNames {