From 920274bce47a6ea21625ccad656c83e67d315af3 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 4 Jan 2017 10:34:52 +0000 Subject: [PATCH] lib/db: Don't panic on unknown folder in ListFolders (fixes #3584) GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3869 --- lib/db/leveldb_dbinstance.go | 18 +++++++----------- lib/db/leveldb_test.go | 10 +++++++++- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/db/leveldb_dbinstance.go b/lib/db/leveldb_dbinstance.go index e16ee033..ffc3d5d3 100644 --- a/lib/db/leveldb_dbinstance.go +++ b/lib/db/leveldb_dbinstance.go @@ -526,9 +526,9 @@ func (db *Instance) ListFolders() []string { folderExists := make(map[string]bool) for dbi.Next() { - folder := string(db.globalKeyFolder(dbi.Key())) - if !folderExists[folder] { - folderExists[folder] = true + folder, ok := db.globalKeyFolder(dbi.Key()) + if ok && !folderExists[string(folder)] { + folderExists[string(folder)] = true } } @@ -558,8 +558,8 @@ func (db *Instance) dropFolder(folder []byte) { // Remove all items related to the given folder from the global bucket dbi = t.NewIterator(util.BytesPrefix([]byte{KeyTypeGlobal}), nil) for dbi.Next() { - itemFolder := db.globalKeyFolder(dbi.Key()) - if bytes.Equal(folder, itemFolder) { + itemFolder, ok := db.globalKeyFolder(dbi.Key()) + if ok && bytes.Equal(folder, itemFolder) { db.Delete(dbi.Key(), nil) } } @@ -680,12 +680,8 @@ func (db *Instance) globalKeyName(key []byte) []byte { } // globalKeyFolder returns the folder name from the key -func (db *Instance) globalKeyFolder(key []byte) []byte { - folder, ok := db.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen:])) - if !ok { - panic("bug: lookup of nonexistent folder ID") - } - return folder +func (db *Instance) globalKeyFolder(key []byte) ([]byte, bool) { + return db.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen:])) } func (db *Instance) getIndexID(device, folder []byte) protocol.IndexID { diff --git a/lib/db/leveldb_test.go b/lib/db/leveldb_test.go index d83e7806..65890a75 100644 --- a/lib/db/leveldb_test.go +++ b/lib/db/leveldb_test.go @@ -45,7 +45,10 @@ func TestGlobalKey(t *testing.T) { key := db.globalKey(fld, name) - fld2 := db.globalKeyFolder(key) + fld2, ok := db.globalKeyFolder(key) + if !ok { + t.Error("should have been found") + } if !bytes.Equal(fld2, fld) { t.Errorf("wrong folder %q != %q", fld2, fld) } @@ -53,4 +56,9 @@ func TestGlobalKey(t *testing.T) { if !bytes.Equal(name2, name) { t.Errorf("wrong name %q != %q", name2, name) } + + _, ok = db.globalKeyFolder([]byte{1, 2, 3, 4, 5}) + if ok { + t.Error("should not have been found") + } }