Browse Source

lib/upnp: Correct the result deduplication mechanism (fixes #3578)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3618
Jakob Borg 9 years ago
parent
commit
3cabecda04
1 changed files with 9 additions and 7 deletions
  1. 9 7
      lib/upnp/upnp.go

+ 9 - 7
lib/upnp/upnp.go

@@ -108,19 +108,21 @@ func Discover(renewal, timeout time.Duration) []nat.Device {
 		close(resultChan)
 	}()
 
+	seenResults := make(map[string]bool)
 nextResult:
 	for result := range resultChan {
-		for _, existingResult := range results {
-			if existingResult.ID() == result.ID() {
-				l.Debugf("Skipping duplicate result %s with services:", result.uuid)
-				for _, service := range result.services {
-					l.Debugf("* [%s] %s", service.ID, service.URL)
-				}
-				continue nextResult
+		if seenResults[result.ID()] {
+			l.Debugf("Skipping duplicate result %s with services:", result.uuid)
+			for _, service := range result.services {
+				l.Debugf("* [%s] %s", service.ID, service.URL)
 			}
+			continue nextResult
 		}
 
+		result := result // Reallocate as we need to keep a pointer
 		results = append(results, &result)
+		seenResults[result.ID()] = true
+
 		l.Debugf("UPnP discovery result %s with services:", result.uuid)
 		for _, service := range result.services {
 			l.Debugf("* [%s] %s", service.ID, service.URL)