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,50 @@ uint64_t nRequests; }; +// 0: ok +// -1: premature end of input, forward reference, component > 63 char, invalid +// character +// -2: insufficient space in output +static inline 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; + // read length of next component + int octet = *((*inpos)++); + if (octet == 0) { + buf[bufused] = 0; + return 0; + } + // add dot in output + if (!init) { + if (bufused == bufsize - 1) return -2; + buf[bufused++] = '.'; + } else + init = 0; + // handle references + if ((octet & 0xC0) == 0xC0) { + if (*inpos == inend) return -1; + int ref = ((octet - 0xC0) << 8) + *((*inpos)++); + 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; + // copy label + while (octet) { + if (*inpos == inend) return -1; + if (bufused == bufsize - 1) return -2; + int c = *((*inpos)++); + if (c == '.') return -1; + octet--; + buf[bufused++] = c; + } + } while (1); +} + 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,50 +46,6 @@ 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) { - size_t bufused = 0; - int init = 1; - do { - if (*inpos == inend) return -1; - // read length of next component - int octet = *((*inpos)++); - if (octet == 0) { - buf[bufused] = 0; - return 0; - } - // add dot in output - if (!init) { - if (bufused == bufsize - 1) return -2; - buf[bufused++] = '.'; - } else - init = 0; - // handle references - if ((octet & 0xC0) == 0xC0) { - if (*inpos == inend) return -1; - int ref = ((octet - 0xC0) << 8) + *((*inpos)++); - 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; - // copy label - while (octet) { - if (*inpos == inend) return -1; - if (bufused == bufsize - 1) return -2; - int c = *((*inpos)++); - if (c == '.') return -1; - octet--; - buf[bufused++] = c; - } - } while (1); -} - // 0: k // -1: component > 63 characters // -2: insufficent space in output @@ -579,10 +535,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);