From 2343c82c33dea213d9ccd0236f3132e161cb270c Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 8 May 2018 09:19:34 +0200 Subject: [PATCH] lib/model: Don't include unshared folders in ClusterConfig (fixes #4926) Also fixes a data race where ClusterConfig would access folderFiles without a lock. Tweaked the ClusterConfig unit test to verify the behavior. --- lib/model/model.go | 22 ++++++++++++++++------ lib/model/model_test.go | 15 ++++++++++++--- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/model/model.go b/lib/model/model.go index 879102cd..781ce827 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -2207,12 +2207,21 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster var message protocol.ClusterConfig m.fmut.RLock() - folderFiles := m.folderFiles - m.fmut.RUnlock() - - var fs *db.FileSet + defer m.fmut.RUnlock() for _, folderCfg := range m.cfg.FolderList() { + isShared := false + for _, sharedWith := range folderCfg.Devices { + if sharedWith.DeviceID == device { + isShared = true + break + } + } + + if !isShared { + continue + } + protocolFolder := protocol.Folder{ ID: folderCfg.ID, Label: folderCfg.Label, @@ -2223,8 +2232,9 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster Paused: folderCfg.Paused, } + var fs *db.FileSet if !folderCfg.Paused { - fs = folderFiles[folderCfg.ID] + fs = m.folderFiles[folderCfg.ID] } for _, device := range folderCfg.Devices { @@ -2239,7 +2249,7 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster Introducer: deviceCfg.Introducer, } - if !folderCfg.Paused { + if fs != nil { if deviceCfg.DeviceID == m.id { protocolDevice.IndexID = fs.IndexID(protocol.LocalDeviceID) protocolDevice.MaxSequence = fs.Sequence(protocol.LocalDeviceID) diff --git a/lib/model/model_test.go b/lib/model/model_test.go index 01a9889e..264f8935 100644 --- a/lib/model/model_test.go +++ b/lib/model/model_test.go @@ -607,20 +607,29 @@ func TestClusterConfig(t *testing.T) { cfg.Folders = []config.FolderConfiguration{ { ID: "folder1", - Path: "testdata", + Path: "testdata1", Devices: []config.FolderDeviceConfiguration{ {DeviceID: device1}, {DeviceID: device2}, }, }, { - ID: "folder2", - Path: "testdata", + ID: "folder2", + Path: "testdata2", + Paused: true, // should still be included Devices: []config.FolderDeviceConfiguration{ {DeviceID: device1}, {DeviceID: device2}, }, }, + { + ID: "folder3", + Path: "testdata3", + Devices: []config.FolderDeviceConfiguration{ + {DeviceID: device1}, + // should not be included, does not include device2 + }, + }, } db := db.OpenMemory()