@@ -267,6 +267,7 @@ type client struct {
267267 unicast4 , unicast6 net.PacketConn
268268 multicast4 , multicast6 net.PacketConn
269269
270+ tmu sync.RWMutex // protects tracker map
270271 tracker map [string ]* dnssdanswer
271272 msgCh chan * dns.Msg // never closed
272273
@@ -577,15 +578,39 @@ func (c *client) recv(conn net.PacketConn) {
577578}
578579
579580// untrack removes a name from the tracker;
580- // name is NOT normalized. untrack is not thread safe.
581+ // name is NOT normalized.
581582func (c * client ) untrack (name string ) {
583+ c .tmu .Lock ()
584+ defer c .tmu .Unlock ()
582585 log .V ("mdns: tracker: rmv %s" , name )
583586 delete (c .tracker , name )
584587}
585588
586589// track marks a name as being tracked by this client;
587- // name is NOT normalized. track is not thread safe.
590+ // name is NOT normalized.
588591func (c * client ) track (name string ) * dnssdanswer {
592+ c .tmu .Lock ()
593+ defer c .tmu .Unlock ()
594+
595+ return c .trackLocked (name )
596+ }
597+
598+ // alias sets up mapping between two tracked entries;
599+ // src and dst are NOT normalized.
600+ func (c * client ) alias (src , dst string ) {
601+ c .tmu .Lock ()
602+ defer c .tmu .Unlock ()
603+
604+ if se , ok := c .tracker [dst ]; ok {
605+ log .VV ("mdns: tracker: discard %v for %s; aliased to %s" , se , dst , src )
606+ }
607+ se := c .trackLocked (src )
608+ log .V ("mdns: tracker: alias %s <-> %s with %v" , src , dst , se )
609+ c .tracker [dst ] = se
610+ }
611+
612+ // trackLocked is the non-locking version of track, called when lock is already held
613+ func (c * client ) trackLocked (name string ) * dnssdanswer {
589614 if tse , ok := c .tracker [name ]; ok {
590615 log .VV ("mdns: tracker: exists %s with %v" , name , tse )
591616 return tse
@@ -598,17 +623,6 @@ func (c *client) track(name string) *dnssdanswer {
598623 return se
599624}
600625
601- // alias sets up mapping between two tracked entries;
602- // src and dst are NOT normalized. alias is not thread safe.
603- func (c * client ) alias (src , dst string ) {
604- if se , ok := c .tracker [dst ]; ok {
605- log .VV ("mdns: tracker: discard %v for %s; aliased to %s" , se , dst , src )
606- }
607- se := c .track (src )
608- log .V ("mdns: tracker: alias %s <-> %s with %v" , src , dst , se )
609- c .tracker [dst ] = se
610- }
611-
612626func extend (c net.PacketConn , t time.Duration ) {
613627 if c != nil && core .IsNotNil (c ) {
614628 _ = c .SetDeadline (time .Now ().Add (t ))
0 commit comments