Просмотр исходного кода

UPnP discovery results must not be collected in a background goroutine (fixes #1858)

Jakob Borg 10 лет назад
Родитель
Сommit
7b6b5981c4
1 измененных файлов с 28 добавлено и 27 удалено
  1. 28 27
      internal/upnp/upnp.go

+ 28 - 27
internal/upnp/upnp.go

@@ -103,32 +103,8 @@ func Discover(timeout time.Duration) []IGD {
 
 	resultChan := make(chan IGD)
 
-	// Aggregator
-	go func() {
-	next:
-		for result := range resultChan {
-			for _, existingResult := range results {
-				if existingResult.uuid == result.uuid {
-					if debug {
-						l.Debugf("Skipping duplicate result %s with services:", result.uuid)
-						for _, svc := range result.services {
-							l.Debugf("* [%s] %s", svc.serviceID, svc.serviceURL)
-						}
-					}
-					goto next
-				}
-			}
-			results = append(results, result)
-			if debug {
-				l.Debugf("UPnP discovery result %s with services:", result.uuid)
-				for _, svc := range result.services {
-					l.Debugf("* [%s] %s", svc.serviceID, svc.serviceURL)
-				}
-			}
-		}
-	}()
-
 	wg := sync.NewWaitGroup()
+
 	for _, intf := range interfaces {
 		// Interface flags seem to always be 0 on Windows
 		if runtime.GOOS != "windows" && (intf.Flags&net.FlagUp == 0 || intf.Flags&net.FlagMulticast == 0) {
@@ -144,8 +120,33 @@ func Discover(timeout time.Duration) []IGD {
 		}
 	}
 
-	wg.Wait()
-	close(resultChan)
+	go func() {
+		wg.Wait()
+		close(resultChan)
+	}()
+
+nextResult:
+	for result := range resultChan {
+		for _, existingResult := range results {
+			if existingResult.uuid == result.uuid {
+				if debug {
+					l.Debugf("Skipping duplicate result %s with services:", result.uuid)
+					for _, svc := range result.services {
+						l.Debugf("* [%s] %s", svc.serviceID, svc.serviceURL)
+					}
+				}
+				continue nextResult
+			}
+		}
+
+		results = append(results, result)
+		if debug {
+			l.Debugf("UPnP discovery result %s with services:", result.uuid)
+			for _, svc := range result.services {
+				l.Debugf("* [%s] %s", svc.serviceID, svc.serviceURL)
+			}
+		}
+	}
 
 	return results
 }