From 1cb55904bc12ea085df70b8ef7af56fd73892dc0 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Fri, 19 Jul 2019 19:39:52 +0200 Subject: [PATCH] lib/model: Prevent panic in NeedFolderFiles (fixes #5872) (#5875) --- lib/model/model.go | 4 ++++ lib/model/requests_test.go | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/lib/model/model.go b/lib/model/model.go index dbd08621b..3e6b557d3 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -847,6 +847,10 @@ func (m *model) NeedFolderFiles(folder string, page, perpage int) ([]db.FileInfo if runnerOk { progressNames, queuedNames, skipped := runner.Jobs(page, perpage) + progress = make([]db.FileInfoTruncated, len(progressNames)) + queued = make([]db.FileInfoTruncated, len(queuedNames)) + seen = make(map[string]struct{}, len(progressNames)+len(queuedNames)) + for i, name := range progressNames { if f, ok := rf.GetGlobalTruncated(name); ok { progress[i] = f diff --git a/lib/model/requests_test.go b/lib/model/requests_test.go index 63667d769..63fc6c588 100644 --- a/lib/model/requests_test.go +++ b/lib/model/requests_test.go @@ -13,6 +13,7 @@ import ( "os" "path/filepath" "runtime" + "strconv" "strings" "testing" "time" @@ -947,3 +948,46 @@ func TestRequestDeleteChanged(t *testing.T) { } } } + +func TestNeedFolderFiles(t *testing.T) { + m, fc, fcfg := setupModelWithConnection() + tfs := fcfg.Filesystem() + tmpDir := tfs.URI() + defer cleanupModelAndRemoveDir(m, tmpDir) + + sub := events.Default.Subscribe(events.RemoteIndexUpdated) + defer events.Default.Unsubscribe(sub) + + errPreventSync := errors.New("you aren't getting any of this") + fc.mut.Lock() + fc.requestFn = func(string, string, int64, int, []byte, bool) ([]byte, error) { + return nil, errPreventSync + } + fc.mut.Unlock() + + data := []byte("foo") + num := 20 + for i := 0; i < num; i++ { + fc.addFile(strconv.Itoa(i), 0644, protocol.FileInfoTypeFile, data) + } + fc.sendIndexUpdate() + + select { + case <-sub.C(): + case <-time.After(5 * time.Second): + t.Fatal("Timed out before receiving index") + } + + progress, queued, rest := m.NeedFolderFiles(fcfg.ID, 1, 100) + if got := len(progress) + len(queued) + len(rest); got != num { + t.Errorf("Got %v needed items, expected %v", got, num) + } + + exp := 10 + for page := 1; page < 3; page++ { + progress, queued, rest := m.NeedFolderFiles(fcfg.ID, page, exp) + if got := len(progress) + len(queued) + len(rest); got != exp { + t.Errorf("Got %v needed items on page %v, expected %v", got, page, exp) + } + } +}