Skip to content

Commit d24fcd8

Browse files
committed
dnsx/mdns: mutex for thread-safety
1 parent c2b63bd commit d24fcd8

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

intra/dns53/mdns.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
581582
func (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.
588591
func (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-
612626
func extend(c net.PacketConn, t time.Duration) {
613627
if c != nil && core.IsNotNil(c) {
614628
_ = c.SetDeadline(time.Now().Add(t))

0 commit comments

Comments
 (0)