blob: 5570b4140aff327cf79fef1be246b60c9f9911b4 [file] [log] [blame]
#include <string.h>
int __dns_parse(const unsigned char* r, int rlen,
int (*callback)(void*, int, const void*, int, const void*), void* ctx) {
int qdcount, ancount;
const unsigned char* p;
int len;
if (rlen < 12)
return -1;
if ((r[3] & 15))
return 0;
p = r + 12;
qdcount = r[4] * 256 + r[5];
ancount = r[6] * 256 + r[7];
if (qdcount + ancount > 64)
return -1;
while (qdcount--) {
while (p - r < rlen && *p - 1U < 127)
p++;
if (*p > 193 || (*p == 193 && p[1] > 254) || p > r + rlen - 6)
return -1;
p += 5 + !!*p;
}
while (ancount--) {
while (p - r < rlen && *p - 1U < 127)
p++;
if (*p > 193 || (*p == 193 && p[1] > 254) || p > r + rlen - 6)
return -1;
p += 1 + !!*p;
len = p[8] * 256 + p[9];
if (p + len > r + rlen)
return -1;
if (callback(ctx, p[1], p + 10, len, r) < 0)
return -1;
p += 10 + len;
}
return 0;
}