DnsParseResponse
Description
Parse a wire-format response into out. The caller is responsible for DnsResponseDeinit(out) afterwards.
Parameters
| Name | Direction | Description |
|---|---|---|
out |
out | Receives parsed structure. Strings + Vecs use alloc. |
buf |
in | Wire bytes received from the nameserver. |
len |
in | Number of bytes in buf. |
alloc |
in | Allocator used for all strings + record Vecs. |
Success
Returns true. out is populated, including a possibly empty answer list (NXDOMAIN with no records is valid).
Failure
Returns false on header truncation, name-compression cycles, oversized labels, or out-of-bounds reads. out is left partially filled but is safe to DnsResponseDeinit.
Usage example (Cross-references)
Usage examples (Cross-references)
- In
Dns.c:540:
// DnsParseResponse takes `Allocator *` -- legitimate erasure
// boundary; pass at the call site, no intermediate variable.
bool ok = DnsParseResponse(&resp, resp_buf, (u64)got, ALLOCATOR_OF(&scratch));
if (!ok || resp.id != id || resp.rcode != DNS_RCODE_NOERROR) {
DnsResponseDeinit(&resp);- In
Dns.c:270:
}
bool DnsParseResponse(DnsResponse *out, const u8 *buf, u64 len, Allocator *alloc) {
if (!out || !buf || !alloc) {
return false;- In
Dns.c:155:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.id == 0x1234 && resp.is_response && resp.recursion_desired && resp.recursion_avail &&- In
Dns.c:221:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.rcode == DNS_RCODE_NXDOMAIN && VecLen(&resp.answers) == 0;- In
Dns.c:292:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:563:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:618:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.id == 0x0005;- In
Dns.c:658:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, a);
bool match = ok && resp.id == 0x0009;- In
Dns.c:738:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, a);
bool match = ok && q2_off == 256 && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:805:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:850:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = !ok; // must be rejected
- In
Dns.c:890:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = !ok; // self pointer must be rejected
- In
Dns.c:916:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.id == 0xABCD && VecLen(&resp.answers) == 0 && VecLen(&resp.authority) == 0 &&
VecLen(&resp.additional) == 0;- In
Dns.c:934:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:960:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.id == 0x1122 && resp.is_response == true && resp.authoritative == true &&
resp.truncated == false && resp.recursion_desired == true && resp.recursion_avail == true &&- In
Dns.c:982:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.is_response == false && resp.authoritative == false && resp.truncated == true &&
resp.recursion_desired == false && resp.recursion_avail == false;- In
Dns.c:1001:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && resp.rcode == DNS_RCODE_NXDOMAIN;- In
Dns.c:1079:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 2;
if (match) {- In
Dns.c:1107:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:1132:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:1218:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 2;
if (match) {- In
Dns.c:1303:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 2;
if (match) {- In
Dns.c:1399:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1 && VecLen(&resp.authority) == 1 && VecLen(&resp.additional) == 1;
if (match) {- In
Dns.c:1466:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:1518:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:1548:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:1567:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:1659:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, a);
bool match = !ok; // real code rejects: 191 + 1 + 62 = 254 > 253.
- In
Dns.c:1696:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, a);
bool match = ok && resp.id == 0x000a;- In
Dns.c:1767:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, a);
bool match = !ok; // real code rejects the truncated rdata.
- In
Dns.c:1825:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:1875:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:1898:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:1922:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), a);
DnsResponseDeinit(&resp);- In
Dns.c:2045:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, len, a);
bool match = ok && VecLen(&resp.answers) == 1;
if (match) {- In
Dns.c:2082:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, sizeof(wire), adbg);
ok = ok && (VecLen(&resp.answers) == 1);
DnsRecord *r = ok ? VecPtrAt(&resp.answers, 0) : NULL;- In
Dns.c:2153:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, adbg);
ok = ok && (VecLen(&resp.authority) == 1);
ok = ok && (VecLen(&resp.answers) == 0) && (VecLen(&resp.additional) == 0);- In
Dns.c:2181:
DnsResponse resp = {0};
bool ok = DnsParseResponse(&resp, wire, p, adbg);
ok = ok && (VecLen(&resp.additional) == 1);
ok = ok && (VecLen(&resp.answers) == 0) && (VecLen(&resp.authority) == 0);
Last updated on