Browse Source

Merge pull request #1244 from syncthing/indexclean

Remove nil filenames from database and indexes (fixes #1243)
Audrius Butkevicius 11 years ago
parent
commit
25c26e2f81
2 changed files with 35 additions and 2 deletions
  1. 10 0
      internal/db/leveldb.go
  2. 25 2
      internal/protocol/protocol.go

+ 10 - 0
internal/db/leveldb.go

@@ -586,6 +586,16 @@ func ldbWithAllFolderTruncated(db *leveldb.DB, folder []byte, fn func(device []b
 		if err != nil {
 			panic(err)
 		}
+
+		if f.Name == "" {
+			l.Infoln("Dropping invalid nil filename from database")
+			batch := new(leveldb.Batch)
+			ldbRemoveFromGlobal(db, batch, folder, device, nil)
+			batch.Delete(dbi.Key())
+			db.Write(batch, nil)
+			continue
+		}
+
 		if cont := fn(device, f); !cont {
 			return
 		}

+ 25 - 2
internal/protocol/protocol.go

@@ -477,14 +477,37 @@ func (c *rawConnection) handleIndex(im IndexMessage) {
 	if debug {
 		l.Debugf("Index(%v, %v, %d files)", c.id, im.Folder, len(im.Files))
 	}
-	c.receiver.Index(c.id, im.Folder, im.Files)
+	c.receiver.Index(c.id, im.Folder, filterIndexMessageFiles(im.Files))
 }
 
 func (c *rawConnection) handleIndexUpdate(im IndexMessage) {
 	if debug {
 		l.Debugf("queueing IndexUpdate(%v, %v, %d files)", c.id, im.Folder, len(im.Files))
 	}
-	c.receiver.IndexUpdate(c.id, im.Folder, im.Files)
+	c.receiver.IndexUpdate(c.id, im.Folder, filterIndexMessageFiles(im.Files))
+}
+
+func filterIndexMessageFiles(fs []FileInfo) []FileInfo {
+	var out []FileInfo
+	for i, f := range fs {
+		if f.Name == "" {
+			l.Infoln("Dropping nil filename from incoming index")
+			if out == nil {
+				// Most incoming updates won't contain anything invalid, so we
+				// delay the allocation and copy to output slice until we
+				// really need to do it, then copy all the so var valid files
+				// to it.
+				out = make([]FileInfo, i, len(fs)-1)
+				copy(out, fs)
+			}
+		} else if out != nil {
+			out = append(out, f)
+		}
+	}
+	if out != nil {
+		return out
+	}
+	return fs
 }
 
 func (c *rawConnection) handleRequest(msgID int, req RequestMessage) {