From 226da976dcd0ed0eca743c98c57b5395784e7d9c Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 21 Dec 2016 10:33:07 +0000 Subject: [PATCH] lib/model: Allow empty subdirs in scan request (fixes #3829) GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3833 --- lib/model/model.go | 12 ++++++++++-- lib/model/model_test.go | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/model/model.go b/lib/model/model.go index 80d192752..ce6099366 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -1706,8 +1706,16 @@ func (m *Model) ScanFolderSubdirs(folder string, subs []string) error { } func (m *Model) internalScanFolderSubdirs(folder string, subDirs []string) error { - for i, sub := range subDirs { - sub = osutil.NativeFilename(sub) + for i := 0; i < len(subDirs); i++ { + sub := osutil.NativeFilename(subDirs[i]) + + if sub == "" { + // A blank subdirs means to scan the entire folder. We can trim + // the subDirs list and go on our way. + subDirs = nil + break + } + // We test each path by joining with "root". What we join with is // not relevant, we just want the dotdot escape detection here. For // historical reasons we may get paths that end in a slash. We diff --git a/lib/model/model_test.go b/lib/model/model_test.go index 8aee3e195..54d8840c2 100644 --- a/lib/model/model_test.go +++ b/lib/model/model_test.go @@ -2181,6 +2181,21 @@ func TestIssue3804(t *testing.T) { } } +func TestIssue3829(t *testing.T) { + dbi := db.OpenMemory() + m := NewModel(defaultConfig, protocol.LocalDeviceID, "device", "syncthing", "dev", dbi, nil) + m.AddFolder(defaultFolderConfig) + m.StartFolder("default") + m.ServeBackground() + defer m.Stop() + + // Empty subdirs should be accepted + + if err := m.ScanFolderSubdirs("default", []string{""}); err != nil { + t.Error("Unexpected error:", err) + } +} + func TestRootedJoinedPath(t *testing.T) { type testcase struct { root string