Merge pull request #67 from safing/fix/mdns-handler-shutdown

Fix correct shutdown of mdns packet listeners
This commit is contained in:
Patrick Pacher 2020-06-04 08:01:37 +02:00 committed by GitHub
commit aa39044895
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -69,7 +69,7 @@ func indexOfRR(entry *dns.RR_Header, list *[]dns.RR) int {
//nolint:gocyclo,gocognit // TODO: make simpler //nolint:gocyclo,gocognit // TODO: make simpler
func listenToMDNS(ctx context.Context) error { func listenToMDNS(ctx context.Context) error {
var err error var err error
messages := make(chan *dns.Msg) messages := make(chan *dns.Msg, 32)
// TODO: init and start every listener in its own service worker // TODO: init and start every listener in its own service worker
// this will make the more resilient and actually able to restart // this will make the more resilient and actually able to restart
@ -80,7 +80,7 @@ func listenToMDNS(ctx context.Context) error {
log.Warningf("intel(mdns): failed to create udp4 listen multicast socket: %s", err) log.Warningf("intel(mdns): failed to create udp4 listen multicast socket: %s", err)
} else { } else {
module.StartServiceWorker("mdns udp4 multicast listener", 0, func(ctx context.Context) error { module.StartServiceWorker("mdns udp4 multicast listener", 0, func(ctx context.Context) error {
return listenForDNSPackets(multicast4Conn, messages) return listenForDNSPackets(ctx, multicast4Conn, messages)
}) })
defer multicast4Conn.Close() defer multicast4Conn.Close()
} }
@ -91,7 +91,7 @@ func listenToMDNS(ctx context.Context) error {
log.Warningf("intel(mdns): failed to create udp6 listen multicast socket: %s", err) log.Warningf("intel(mdns): failed to create udp6 listen multicast socket: %s", err)
} else { } else {
module.StartServiceWorker("mdns udp6 multicast listener", 0, func(ctx context.Context) error { module.StartServiceWorker("mdns udp6 multicast listener", 0, func(ctx context.Context) error {
return listenForDNSPackets(multicast6Conn, messages) return listenForDNSPackets(ctx, multicast6Conn, messages)
}) })
defer multicast6Conn.Close() defer multicast6Conn.Close()
} }
@ -102,7 +102,7 @@ func listenToMDNS(ctx context.Context) error {
log.Warningf("intel(mdns): failed to create udp4 listen socket: %s", err) log.Warningf("intel(mdns): failed to create udp4 listen socket: %s", err)
} else { } else {
module.StartServiceWorker("mdns udp4 unicast listener", 0, func(ctx context.Context) error { module.StartServiceWorker("mdns udp4 unicast listener", 0, func(ctx context.Context) error {
return listenForDNSPackets(unicast4Conn, messages) return listenForDNSPackets(ctx, unicast4Conn, messages)
}) })
defer unicast4Conn.Close() defer unicast4Conn.Close()
} }
@ -113,7 +113,7 @@ func listenToMDNS(ctx context.Context) error {
log.Warningf("intel(mdns): failed to create udp6 listen socket: %s", err) log.Warningf("intel(mdns): failed to create udp6 listen socket: %s", err)
} else { } else {
module.StartServiceWorker("mdns udp6 unicast listener", 0, func(ctx context.Context) error { module.StartServiceWorker("mdns udp6 unicast listener", 0, func(ctx context.Context) error {
return listenForDNSPackets(unicast6Conn, messages) return listenForDNSPackets(ctx, unicast6Conn, messages)
}) })
defer unicast6Conn.Close() defer unicast6Conn.Close()
} }
@ -319,7 +319,7 @@ func handleMDNSMessages(ctx context.Context, messages chan *dns.Msg) error {
} }
func listenForDNSPackets(conn *net.UDPConn, messages chan *dns.Msg) error { func listenForDNSPackets(ctx context.Context, conn *net.UDPConn, messages chan *dns.Msg) error {
buf := make([]byte, 65536) buf := make([]byte, 65536)
for { for {
n, err := conn.Read(buf) n, err := conn.Read(buf)
@ -335,7 +335,11 @@ func listenForDNSPackets(conn *net.UDPConn, messages chan *dns.Msg) error {
log.Debugf("resolver: failed to unpack message: %s", err) log.Debugf("resolver: failed to unpack message: %s", err)
continue continue
} }
messages <- message select {
case messages <- message:
case <-ctx.Done():
return nil
}
} }
} }