Fix goroutine leak

This commit is contained in:
Neil Alexander 2020-05-10 12:08:48 +01:00
parent cd93bf9e7b
commit e93612b522
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -197,7 +197,10 @@ func (m *MDNS) _updateInterfaces() {
// Work out which interfaces are new. // Work out which interfaces are new.
for n, addrs := range interfaces { for n, addrs := range interfaces {
if _, ok := m._servers[n]; !ok { if _, ok := m._servers[n]; !ok {
for addr, intf := range addrs { m._servers[n] = make(map[string]*mDNSServer)
}
for addr, intf := range addrs {
if _, ok := m._servers[n][addr]; !ok {
if err := m._startInterface(intf, addr); err != nil { if err := m._startInterface(intf, addr); err != nil {
m.log.Errorf("Failed to start mDNS interface %s on address %s: %s", n, addr, err) m.log.Errorf("Failed to start mDNS interface %s on address %s: %s", n, addr, err)
} else { } else {
@ -236,6 +239,11 @@ func (m *MDNS) _updateInterfaces() {
} }
func (m *MDNS) _startInterface(intf net.Interface, addr string) error { func (m *MDNS) _startInterface(intf net.Interface, addr string) error {
// Don't start a new interface if it is already alive.
if _, ok := m._servers[intf.Name][addr]; ok {
return errors.New("already started")
}
// Construct a listener on this address. // Construct a listener on this address.
// Work out what the listen address of the new TCP listener should be. // Work out what the listen address of the new TCP listener should be.
ip := net.ParseIP(addr) ip := net.ParseIP(addr)
@ -328,9 +336,8 @@ func (s *mDNSServer) listen() {
incoming := make(chan *mdns.ServiceEntry) incoming := make(chan *mdns.ServiceEntry)
go func() { go func() {
defer close(s.stop)
if err := mdns.Lookup(MDNSService, MDNSDomain, incoming); err != nil { if err := mdns.Lookup(MDNSService, MDNSDomain, incoming); err != nil {
s.mdns.log.Errorln("Failed to initialize resolver:", err.Error()) s.mdns.log.Println("Failed to initialize resolver:", err.Error())
} }
}() }()
@ -338,7 +345,7 @@ func (s *mDNSServer) listen() {
select { select {
case <-s.stop: case <-s.stop:
s.mdns.log.Debugln("Stopped listening for mDNS on", s.intf.Name) s.mdns.log.Debugln("Stopped listening for mDNS on", s.intf.Name)
break return
case entry := <-incoming: case entry := <-incoming:
if bytes.Equal(entry.Addr, s.ourIP) { if bytes.Equal(entry.Addr, s.ourIP) {
continue continue