fix infinite loop AAAA requests
This commit is contained in:
parent
2b29f0a760
commit
8530bfa64d
1 changed files with 11 additions and 5 deletions
16
main.cpp
16
main.cpp
|
@ -132,7 +132,8 @@ extern "C" int GetIPList(void *thread, addr_t *addr, int max, int ipv4, int ipv6
|
||||||
|
|
||||||
class CDnsThread {
|
class CDnsThread {
|
||||||
public:
|
public:
|
||||||
dns_opt_t dns_opt;
|
dns_opt_t dns_opt; // must be first
|
||||||
|
const int id;
|
||||||
vector<addr_t> cache;
|
vector<addr_t> cache;
|
||||||
int nIPv4, nIPv6;
|
int nIPv4, nIPv6;
|
||||||
time_t cacheTime;
|
time_t cacheTime;
|
||||||
|
@ -179,7 +180,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CDnsThread(CDnsSeedOpts* opts) {
|
CDnsThread(CDnsSeedOpts* opts, int idIn) : id(idIn) {
|
||||||
dns_opt.host = opts->host;
|
dns_opt.host = opts->host;
|
||||||
dns_opt.ns = opts->ns;
|
dns_opt.ns = opts->ns;
|
||||||
dns_opt.mbox = opts->mbox;
|
dns_opt.mbox = opts->mbox;
|
||||||
|
@ -206,9 +207,12 @@ public:
|
||||||
extern "C" int GetIPList(void *data, addr_t* addr, int max, int ipv4, int ipv6) {
|
extern "C" int GetIPList(void *data, addr_t* addr, int max, int ipv4, int ipv6) {
|
||||||
CDnsThread *thread = (CDnsThread*)data;
|
CDnsThread *thread = (CDnsThread*)data;
|
||||||
thread->cacheHit();
|
thread->cacheHit();
|
||||||
unsigned int size = (ipv4 ? thread->nIPv4 : 0) + (ipv6 ? thread->nIPv6 : 0);
|
unsigned int size = thread->cache.size();
|
||||||
|
unsigned int maxmax = (ipv4 ? thread->nIPv4 : 0) + (ipv6 ? thread->nIPv6 : 0);
|
||||||
if (max > size)
|
if (max > size)
|
||||||
max = size;
|
max = size;
|
||||||
|
if (max > maxmax)
|
||||||
|
max = maxmax;
|
||||||
int i=0;
|
int i=0;
|
||||||
while (i<max) {
|
while (i<max) {
|
||||||
int j = i + (rand() % (size - i));
|
int j = i + (rand() % (size - i));
|
||||||
|
@ -216,7 +220,9 @@ extern "C" int GetIPList(void *data, addr_t* addr, int max, int ipv4, int ipv6)
|
||||||
bool ok = (ipv4 && thread->cache[j].v == 4) ||
|
bool ok = (ipv4 && thread->cache[j].v == 4) ||
|
||||||
(ipv6 && thread->cache[j].v == 6);
|
(ipv6 && thread->cache[j].v == 6);
|
||||||
if (ok) break;
|
if (ok) break;
|
||||||
j = i + ((j - i + 1) % (size - i));
|
j++;
|
||||||
|
if (j==size)
|
||||||
|
j=i;
|
||||||
} while(1);
|
} while(1);
|
||||||
addr[i] = thread->cache[j];
|
addr[i] = thread->cache[j];
|
||||||
thread->cache[j] = thread->cache[i];
|
thread->cache[j] = thread->cache[i];
|
||||||
|
@ -347,7 +353,7 @@ int main(int argc, char **argv) {
|
||||||
printf("Starting %i DNS threads for %s on %s (port %i)...", opts.nDnsThreads, opts.host, opts.ns, opts.nPort);
|
printf("Starting %i DNS threads for %s on %s (port %i)...", opts.nDnsThreads, opts.host, opts.ns, opts.nPort);
|
||||||
dnsThread.clear();
|
dnsThread.clear();
|
||||||
for (int i=0; i<opts.nDnsThreads; i++) {
|
for (int i=0; i<opts.nDnsThreads; i++) {
|
||||||
dnsThread.push_back(new CDnsThread(&opts));
|
dnsThread.push_back(new CDnsThread(&opts, i));
|
||||||
pthread_create(&threadDns, NULL, ThreadDNS, dnsThread[i]);
|
pthread_create(&threadDns, NULL, ThreadDNS, dnsThread[i]);
|
||||||
printf(".");
|
printf(".");
|
||||||
Sleep(20);
|
Sleep(20);
|
||||||
|
|
Loading…
Reference in a new issue