From 3cdb0a83fd7bcbd87833417301430a708f6288c3 Mon Sep 17 00:00:00 2001 From: Patricio Whittingslow Date: Mon, 16 Mar 2026 15:59:52 -0300 Subject: [PATCH] fix spurious endless mdns response --- mdns/client.go | 1 + mdns/mdns_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/mdns/client.go b/mdns/client.go index 65bcba4..170c1c9 100644 --- a/mdns/client.go +++ b/mdns/client.go @@ -227,6 +227,7 @@ func (c *Client) encapsResponse(frame []byte) (int, error) { if err != nil { return 0, err } + c.rans = c.rans[:0] // Drain pending answers after successful send. return len(data), nil } diff --git a/mdns/mdns_test.go b/mdns/mdns_test.go index 3c9fcd2..a09094e 100644 --- a/mdns/mdns_test.go +++ b/mdns/mdns_test.go @@ -381,6 +381,45 @@ func TestClientMultipleResponders(t *testing.T) { } } +func TestClientResponderSendsOnce(t *testing.T) { + svc := testService() + responder := newResponder(t, []Service{svc}) + querier := newQuerier(t, []dns.Question{{ + Name: mustNewName("_http._tcp.local"), + Type: dns.TypePTR, + Class: dns.ClassINET, + }}, 8) + + var buf [1024]byte + + // Querier sends query, responder processes it. + n, err := querier.Encapsulate(buf[:], -1, 0) + if err != nil || n == 0 { + t.Fatal("querier encapsulate:", err, n) + } + if err = responder.Demux(buf[:n], 0); err != nil { + t.Fatal("responder demux:", err) + } + + // First Encapsulate should produce a response. + n, err = responder.Encapsulate(buf[:], -1, 0) + if err != nil || n == 0 { + t.Fatal("responder first encapsulate:", err, n) + } + + // Subsequent Encapsulate calls without new queries must produce nothing. + const maxSpurious = 5 + for i := range maxSpurious { + n, err = responder.Encapsulate(buf[:], -1, 0) + if err != nil { + t.Fatal("responder encapsulate:", err) + } + if n != 0 { + t.Fatalf("responder sent spurious response on call %d (got %d bytes); expected silence after first response", i+1, n) + } + } +} + func TestClientAbort(t *testing.T) { svc := testService() responder := newResponder(t, []Service{svc})