From 295c4c2b852c83ff265466cdeba3cbbc05820e4a Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Tue, 28 Nov 2017 00:38:17 +0100 Subject: [PATCH] fusefrontend: Set owner after symlink creation in PlaintextNames mode This is already done in regular mode, but was missing when PlaintextNames mode is enabled. As a result, symlinks created by non-root users were still owned by root afterwards. Fixes https://github.com/rfjakob/gocryptfs/issues/176 --- internal/fusefrontend/fs.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 05167df..bb2f192 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -427,16 +427,15 @@ func (fs *FS) Symlink(target string, linkName string, context *fuse.Context) (co if err != nil { return fuse.ToStatus(err) } - if fs.args.PlaintextNames { - err = os.Symlink(target, cPath) - return fuse.ToStatus(err) + var cTarget string = target + if !fs.args.PlaintextNames { + // Symlinks are encrypted like file contents (GCM) and base64-encoded + cBinTarget := fs.contentEnc.EncryptBlock([]byte(target), 0, nil) + cTarget = fs.nameTransform.B64.EncodeToString(cBinTarget) } - // Symlinks are encrypted like file contents (GCM) and base64-encoded - cBinTarget := fs.contentEnc.EncryptBlock([]byte(target), 0, nil) - cTarget := fs.nameTransform.B64.EncodeToString(cBinTarget) // Handle long file name cName := filepath.Base(cPath) - if nametransform.IsLongContent(cName) { + if !fs.args.PlaintextNames && nametransform.IsLongContent(cName) { var dirfd *os.File dirfd, err = os.Open(filepath.Dir(cPath)) if err != nil {