Browse Source

lib/model: Accept scan requests of paths ending in slash (fixes #3804)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3805
Jakob Borg 9 years ago
parent
commit
abb8a1914a
2 changed files with 19 additions and 1 deletions
  1. 4 1
      lib/model/model.go
  2. 15 0
      lib/model/model_test.go

+ 4 - 1
lib/model/model.go

@@ -1690,7 +1690,10 @@ func (m *Model) internalScanFolderSubdirs(folder string, subDirs []string) error
 	for i, sub := range subDirs {
 		sub = osutil.NativeFilename(sub)
 		// We test each path by joining with "root". What we join with is
-		// not relevant, we just want the dotdot escape detection here.
+		// not relevant, we just want the dotdot escape detection here. For
+		// historical reasons we may get paths that end in a slash. We
+		// remove that first to allow the rootedJoinedPath to pass.
+		sub = strings.TrimRight(sub, string(os.PathSeparator))
 		if _, err := rootedJoinedPath("root", sub); err != nil {
 			return errors.New("invalid subpath")
 		}

+ 15 - 0
lib/model/model_test.go

@@ -2166,6 +2166,21 @@ func TestIssue3496(t *testing.T) {
 	}
 }
 
+func TestIssue3804(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()
+
+	// Subdirs ending in slash should be accepted
+
+	if err := m.ScanFolderSubdirs("default", []string{"baz/", "foo"}); err != nil {
+		t.Error("Unexpected error:", err)
+	}
+}
+
 func TestRootedJoinedPath(t *testing.T) {
 	type testcase struct {
 		root   string