Преглед изворни кода

lib/model: Correctly set xattrs on temp files (fixes #8667) (#8670)

Jakob Borg пре 2 година
родитељ
комит
6aa04118a6
2 измењених фајлова са 43 додато и 1 уклоњено
  1. 1 1
      lib/model/folder_sendrecv.go
  2. 42 0
      lib/model/folder_test.go

+ 1 - 1
lib/model/folder_sendrecv.go

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

+ 42 - 0
lib/model/folder_test.go

@@ -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 {
@@ -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)
+	}
+}