浏览代码

Fix: insertRankedServerEntry incorrectly allowed duplicate ranked server entry IDs

Rod Hynes 10 年之前
父节点
当前提交
0ea7184087
共有 1 个文件被更改,包括 20 次插入11 次删除
  1. 20 11
      psiphon/dataStore_alt.go

+ 20 - 11
psiphon/dataStore_alt.go

@@ -271,20 +271,29 @@ func insertRankedServerEntry(tx *bolt.Tx, serverEntryId string, position int) er
 	// enough to meet the shuffleHeadLength = config.TunnelPoolSize criteria, for
 	// any reasonable configuration of config.TunnelPoolSize.
 
-	if position >= len(rankedServerEntries) {
-		rankedServerEntries = append(rankedServerEntries, serverEntryId)
-	} else {
-		end := len(rankedServerEntries)
-		if end+1 > rankedServerEntryCount {
-			end = rankedServerEntryCount
+	// Using: https://github.com/golang/go/wiki/SliceTricks
+
+	// When serverEntryId is already ranked, remove it first to avoid duplicates
+
+	for i, rankedServerEntryId := range rankedServerEntries {
+		if rankedServerEntryId == serverEntryId {
+			rankedServerEntries = append(
+				rankedServerEntries[:i], rankedServerEntries[i+1:]...)
+			break
 		}
-		// insert: https://github.com/golang/go/wiki/SliceTricks
-		rankedServerEntries = append(
-			rankedServerEntries[:position],
-			append([]string{serverEntryId},
-				rankedServerEntries[position:end]...)...)
 	}
 
+	// SliceTricks insert, with length cap enforced
+
+	if len(rankedServerEntries) < rankedServerEntryCount {
+		rankedServerEntries = append(rankedServerEntries, "")
+	}
+	if position >= len(rankedServerEntries) {
+		position = len(rankedServerEntries) - 1
+	}
+	copy(rankedServerEntries[position+1:], rankedServerEntries[position:])
+	rankedServerEntries[position] = serverEntryId
+
 	err = setRankedServerEntries(tx, rankedServerEntries)
 	if err != nil {
 		return ContextError(err)