Package: syncthing
Version: 1.12.1~ds1-2
Severity: important

Accepting a new folder can lead to missing files on initial sync. See
upstream bug [1] and PR for details. This can lead to an inconsistent
state, with files not being synced, thus I used severity important.

The patch fixing this is attached.

[1]: https://github.com/syncthing/syncthing/issues/7649




diff --git a/lib/model/indexsender.go b/lib/model/indexsender.go
index 7bca774..8b9e02a 100644
--- a/lib/model/indexsender.go
+++ b/lib/model/indexsender.go
@@ -329,15 +329,15 @@ func (r *indexSenderRegistry) addLocked(folder config.FolderConfiguration, fset
 // addPending stores the given info to start an index sender once resume is called
 // for this folder.
 // If an index sender is already running, it will be stopped.
-func (r *indexSenderRegistry) addPending(folder config.FolderConfiguration, startInfo *indexSenderStartInfo) {
+func (r *indexSenderRegistry) addPending(folderID string, startInfo *indexSenderStartInfo) {
 	r.mut.Lock()
 	defer r.mut.Unlock()
 
-	if is, ok := r.indexSenders[folder.ID]; ok {
+	if is, ok := r.indexSenders[folderID]; ok {
 		r.sup.RemoveAndWait(is.token, 0)
-		delete(r.indexSenders, folder.ID)
+		delete(r.indexSenders, folderID)
 	}
-	r.startInfos[folder.ID] = startInfo
+	r.startInfos[folderID] = startInfo
 }
 
 // remove stops a running index sender or removes one pending to be started.
diff --git a/lib/model/model.go b/lib/model/model.go
index 64e7bc6..1558321 100644
--- a/lib/model/model.go
+++ b/lib/model/model.go
@@ -1252,7 +1252,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
 				continue
 			}
 			m.cfg.AddOrUpdatePendingFolder(folder.ID, folder.Label, deviceID)
-			indexSenders.addPending(cfg, ccDeviceInfos[folder.ID])
+			indexSenders.addPending(folder.ID, ccDeviceInfos[folder.ID])
 			changed = true
 			m.evLogger.Log(events.FolderRejected, map[string]string{
 				"folder":      folder.ID,
@@ -1270,7 +1270,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
 		}
 
 		if cfg.Paused {
-			indexSenders.addPending(cfg, ccDeviceInfos[folder.ID])
+			indexSenders.addPending(cfg.ID, ccDeviceInfos[folder.ID])
 			continue
 		}
 
@@ -1312,7 +1312,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
 			// Shouldn't happen because !cfg.Paused, but might happen
 			// if the folder is about to be unpaused, but not yet.
 			l.Debugln("ccH: no fset", folder.ID)
-			indexSenders.addPending(cfg, ccDeviceInfos[folder.ID])
+			indexSenders.addPending(cfg.ID, ccDeviceInfos[folder.ID])
 			continue
 		}
 

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to