Skip to content

Commit

Permalink
lib/model: Correctly set xattrs on temp files (fixes #8667) (#8670)
Browse files Browse the repository at this point in the history
  • Loading branch information
calmh committed Nov 11, 2022
1 parent 1b32e9f commit 6aa0411
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/model/folder_sendrecv.go
Expand Up @@ -2120,7 +2120,7 @@ func (f *sendReceiveFolder) checkToBeDeleted(file, cur protocol.FileInfo, hasCur
func (f *sendReceiveFolder) setPlatformData(file *protocol.FileInfo, name string) error {
if f.SyncXattrs {
// Set extended attributes.
if err := f.mtimefs.SetXattr(file.Name, file.Platform.Xattrs(), f.XattrFilter); errors.Is(err, fs.ErrXattrsNotSupported) {
if err := f.mtimefs.SetXattr(name, file.Platform.Xattrs(), f.XattrFilter); errors.Is(err, fs.ErrXattrsNotSupported) {
l.Debugf("Cannot set xattrs on %q: %v", file.Name, err)
} else if err != nil {
return err
Expand Down
42 changes: 42 additions & 0 deletions lib/model/folder_test.go
Expand Up @@ -14,6 +14,8 @@ import (

"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/fs"
"github.com/syncthing/syncthing/lib/protocol"
)

type unifySubsCase struct {
Expand Down Expand Up @@ -149,3 +151,43 @@ func BenchmarkUnifySubs(b *testing.B) {
}
}
}

func TestSetPlatformData(t *testing.T) {
// Checks that setPlatformData runs without error when applied to a temp
// file, named differently than the given FileInfo.

dir := t.TempDir()
fs := fs.NewFilesystem(fs.FilesystemTypeBasic, dir)
if fd, err := fs.Create("file.tmp"); err != nil {
t.Fatal(err)
} else {
fd.Close()
}

xattr := []protocol.Xattr{{Name: "user.foo", Value: []byte("bar")}}
fi := &protocol.FileInfo{
Name: "should be ignored",
Permissions: 0400,
ModifiedS: 1234567890,
Platform: protocol.PlatformData{
Linux: &protocol.XattrData{Xattrs: xattr},
Darwin: &protocol.XattrData{Xattrs: xattr},
FreeBSD: &protocol.XattrData{Xattrs: xattr},
NetBSD: &protocol.XattrData{Xattrs: xattr},
},
}

// Minimum required to support setPlatformData
sr := &sendReceiveFolder{
folder: folder{
FolderConfiguration: config.FolderConfiguration{
SyncXattrs: true,
},
mtimefs: fs,
},
}

if err := sr.setPlatformData(fi, "file.tmp"); err != nil {
t.Error(err)
}
}

0 comments on commit 6aa0411

Please sign in to comment.