| Index: fusl/src/network/dns_parse.c
|
| diff --git a/fusl/src/network/dns_parse.c b/fusl/src/network/dns_parse.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0c7a60112473974601e86ac8fb0712dcb5fe3083
|
| --- /dev/null
|
| +++ b/fusl/src/network/dns_parse.c
|
| @@ -0,0 +1,32 @@
|
| +#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;
|
| +}
|
|
|