• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

dnsimple / dns_erlang / 30259340523
92%

Build:
DEFAULT BRANCH: main
Ran 27 Jul 2026 10:47AM UTC
Jobs 1
Files 12
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

27 Jul 2026 10:41AM UTC coverage: 91.914% (+0.01%) from 91.904%
30259340523

push

github

NelsonVides
Decline zone transfers in decode_query/1 (rfc1995, rfc5936)

Two faults, one shape. The opcode 0 header guard from #101 required
NSCOUNT = 0, but rfc1995 §3 has an IXFR client state the serial it holds
by putting that SOA in the authority section, so every conformant IXFR
query was rejected as formerr; erldns drops what it cannot decode without
replying, so a secondary retried on a timer and never learned why. The
exemption was in #101's own survey, under miekg/dns: "Allows at most 1 RR
in Answer/Authority sections (for NOTIFY/IXFR)". NOTIFY got its clause.

Admitting the record is not enough, because nothing downstream knows what
a transfer is. Driving the erldns pipeline with a decoded IXFR gives
NOERROR, aa=true, an empty answer and the zone's SOA in authority: no
record carries type 251, so it resolves to NODATA like any other qtype
that matches nothing. That is worse than the formerr it replaces. rfc1995
§4 gives a lone SOA and nothing else the meaning "your copy is current",
and this reply is one SOA away from that, so a lenient secondary can read
it as confirmation that it is in sync with a zone it has never once
transferred. Silence at least fails loudly.

So decline them here, as the opcodes above already are. rfc1035 §4.1.1
defines NOTIMP as "the name server does not support the requested kind of
query", which is the literal truth: a transfer is answered as a stream of
messages over a held connection, and a caller that gets one decoded
message back cannot produce that. A server implementing transfers decodes
with decode_message/1 and runs its own loop, as it must regardless.

The check reads the decoded message rather than gating ahead of it. The
qtype lives in the question section, so testing it before decode_body/3
would parse the questions twice on every query to catch a rare one; two
clauses on the way out cost the same and only on the way out. AXFR needs
no authority record and never tripped the guard, but resolved to the same
NODATA, s... (continued)

5 of 5 new or added lines in 1 file covered. (100.0%)

2978 of 3240 relevant lines covered (91.91%)

11669.93 hits per line

Jobs
ID Job ID Ran Files Coverage
1 30259340523.1 27 Jul 2026 10:47AM UTC 12
91.91
GitHub Action Run
Source Files on build 30259340523
  • Tree
  • List 12
  • Changed 1
  • Source Changed 1
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #30259340523
  • 29bf3a84 on github
  • Prev Build on main (#30253944014)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc