summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorJakob Unterwurzacher2018-03-25 21:02:33 +0200
committerJakob Unterwurzacher2018-03-25 21:06:10 +0200
commitdb778aae7db844e77b602816a4fd0aeab5d6857e (patch)
tree1544087ce9fb32926a276781507c2604b366e113 /internal
parent1ed3d51df1750d5472b1349222c352171f1e8d64 (diff)
fusefrontend: handle empty xattrs efficiently
We handle empty files by storing an actual empty file on disk. Handle xattrs similarily and encrypt the empty value to the empty value.
Diffstat (limited to 'internal')
-rw-r--r--internal/fusefrontend/fs.go8
1 files changed, 8 insertions, 0 deletions
diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go
index 738f113..e246264 100644
--- a/internal/fusefrontend/fs.go
+++ b/internal/fusefrontend/fs.go
@@ -348,7 +348,11 @@ func (fs *FS) StatFs(path string) *fuse.StatfsOut {
// decryptSymlinkTarget: "cData64" is base64-decoded and decrypted
// like file contents (GCM).
+// The empty string decrypts to the empty string.
func (fs *FS) decryptSymlinkTarget(cData64 string) (string, error) {
+ if cData64 == "" {
+ return "", nil
+ }
cData, err := fs.nameTransform.B64.DecodeString(cData64)
if err != nil {
return "", err
@@ -409,7 +413,11 @@ func (fs *FS) Unlink(path string, context *fuse.Context) (code fuse.Status) {
// encryptSymlinkTarget: "data" is encrypted like file contents (GCM)
// and base64-encoded.
+// The empty string encrypts to the empty string.
func (fs *FS) encryptSymlinkTarget(data string) (cData64 string) {
+ if data == "" {
+ return ""
+ }
cData := fs.contentEnc.EncryptBlock([]byte(data), 0, nil)
cData64 = fs.nameTransform.B64.EncodeToString(cData)
return cData64