From 682b4f4d280b72b8eb01d014a3fbdaacc2536d3c Mon Sep 17 00:00:00 2001 From: Nicolas Bouffard Date: Wed, 21 Aug 2024 10:50:54 +0200 Subject: [PATCH] fix: avoid panic due to sending on closed channel (#455) the channel is not closed anymore and before sending results on the channel, we check if the context hasn't terminated yet Co-authored-by: dmissmann <37073203+dmissmann@users.noreply.github.com> --- ios/discover.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ios/discover.go b/ios/discover.go index b5df6170..999e1fe1 100644 --- a/ios/discover.go +++ b/ios/discover.go @@ -20,7 +20,10 @@ func FindDeviceInterfaceAddress(ctx context.Context, device DeviceEntry) (string } result := make(chan string) - defer close(result) + + var cancel context.CancelFunc + ctx, cancel = context.WithCancel(ctx) + defer cancel() for _, iface := range ifaces { resolver, err := zeroconf.NewResolver(zeroconf.SelectIfaces([]net.Interface{iface}), zeroconf.SelectIPTraffic(zeroconf.IPv6)) @@ -57,13 +60,13 @@ func checkEntry(ctx context.Context, device DeviceEntry, interfaceName string, e } print(entry.ServiceInstanceName()) for _, ip6 := range entry.AddrIPv6 { - tryHandshake(ip6, entry.Port, interfaceName, device, result) + tryHandshake(ctx, ip6, entry.Port, interfaceName, device, result) } } } } -func tryHandshake(ip6 net.IP, port int, interfaceName string, device DeviceEntry, result chan<- string) { +func tryHandshake(ctx context.Context, ip6 net.IP, port int, interfaceName string, device DeviceEntry, result chan<- string) { addr := fmt.Sprintf("%s%%%s", ip6.String(), interfaceName) s, err := NewWithAddrPortDevice(addr, port, device) udid := device.Properties.SerialNumber @@ -77,6 +80,10 @@ func tryHandshake(ip6 net.IP, port int, interfaceName string, device DeviceEntry return } if udid == h.Udid { - result <- addr + select { + case <-ctx.Done(): + slog.Error("failed sending handshake result", "error", ctx.Err()) + case result <- addr: + } } }