diff --git a/src/seeder/dns.h b/src/seeder/dns.h --- a/src/seeder/dns.h +++ b/src/seeder/dns.h @@ -2,6 +2,8 @@ #define BITCOIN_SEEDER_DNS_H 1 #include +#include +#include struct addr_t { int v; @@ -24,6 +26,13 @@ uint64_t nRequests; }; +// 0: ok +// -1: premature end of input, forward reference, component > 63 char, invalid +// character +// -2: insufficient space in output +int parse_name(const uint8_t **inpos, const uint8_t *inend, + const uint8_t *inbuf, char *buf, size_t bufsize); + int dnsserver(dns_opt_t *opt); #endif // BITCOIN_SEEDER_DNS_H diff --git a/src/seeder/dns.cpp b/src/seeder/dns.cpp --- a/src/seeder/dns.cpp +++ b/src/seeder/dns.cpp @@ -46,16 +46,14 @@ QTYPE_ANY = 255 } dns_type; -// 0: ok -// -1: premature end of input, forward reference, component > 63 char, invalid -// character -// -2: insufficient space in output -static int parse_name(const uint8_t **inpos, const uint8_t *inend, - const uint8_t *inbuf, char *buf, size_t bufsize) { +int parse_name(const uint8_t **inpos, const uint8_t *inend, + const uint8_t *inbuf, char *buf, size_t bufsize) { size_t bufused = 0; int init = 1; do { - if (*inpos == inend) return -1; + if (*inpos == inend) { + return -1; + } // read length of next component int octet = *((*inpos)++); if (octet == 0) { @@ -64,26 +62,40 @@ } // add dot in output if (!init) { - if (bufused == bufsize - 1) return -2; + if (bufused == bufsize - 1) { + return -2; + } buf[bufused++] = '.'; } else init = 0; // handle references if ((octet & 0xC0) == 0xC0) { - if (*inpos == inend) return -1; + if (*inpos == inend) { + return -1; + } int ref = ((octet - 0xC0) << 8) + *((*inpos)++); - if (ref < 0 || ref >= (*inpos) - inbuf - 2) return -1; + if (ref < 0 || ref >= (*inpos) - inbuf - 2) { + return -1; + } const uint8_t *newbuf = inbuf + ref; return parse_name(&newbuf, (*inpos) - 2, inbuf, buf + bufused, bufsize - bufused); } - if (octet > 63) return -1; + if (octet > 63) { + return -1; + } // copy label while (octet) { - if (*inpos == inend) return -1; - if (bufused == bufsize - 1) return -2; + if (*inpos == inend) { + return -1; + } + if (bufused == bufsize - 1) { + return -2; + } int c = *((*inpos)++); - if (c == '.') return -1; + if (c == '.') { + return -1; + } octet--; buf[bufused++] = c; } @@ -579,10 +591,10 @@ for (; 1; ++(opt->nRequests)) { ssize_t insize = recvmsg(listenSocket, &msg, 0); - // uint8_t *addr = (uint8_t*)&si_other.sin_addr.s_addr; - // fprintf(stdout, "DNS: Request %llu from %i.%i.%i.%i:%i of %i - // bytes\n", (unsigned long long)(opt->nRequests), addr[0], addr[1], - // addr[2], addr[3], ntohs(si_other.sin_port), (int)insize); + // uint8_t *addr = (uint8_t*)&si_other.sin6_addr.s6_addr; + // fprintf(stdout, "DNS: Request %llu from %i.%i.%i.%i:%i of %i + // bytes\n", (unsigned long long)(opt->nRequests), addr[0], addr[1], + // addr[2], addr[3], ntohs(si_other.sin6_port), (int)insize); if (insize <= 0) continue; ssize_t ret = dnshandle(opt, inbuf, insize, outbuf);