X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdns.cpp;h=ab244a0493610f6113f6dae098984c1db97f5ffb;hb=fc9e00f49299cb3b402406b5f185d5f4af1e9780;hp=d4fe1398b0d023131a6a0f471a1e90d9dad8b715;hpb=93af9b93f3790b1ca3a570e9715afe6a9304d536;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dns.cpp b/src/dns.cpp index d4fe1398b..ab244a049 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -162,7 +162,8 @@ inline void dns_empty_header(unsigned char *output, const s_header *header, cons void dns_close(int fd) { #ifndef THREADED_DNS - ServerInstance->SE->DelFd(fd); + if (ServerInstance && ServerInstance->SE) + ServerInstance->SE->DelFd(fd); #endif log(DEBUG,"DNS: dns_close on fd %d",fd); if (fd == lastcreate) @@ -209,12 +210,12 @@ void DNS::dns_init() void DNS::dns_init_2(const char* dnsserver) { - in_addr addr4; - i4 = 0; - srand((unsigned int) TIME); - memset(servers4,'\0',sizeof(in_addr) * 8); - if (dns_aton4_s(dnsserver,&addr4) != NULL) - memcpy(&servers4[i4++],&addr4,sizeof(in_addr)); + in_addr addr4; + i4 = 0; + srand((unsigned int) TIME); + memset(servers4,'\0',sizeof(in_addr) * 8); + if (dns_aton4_s(dnsserver,&addr4) != NULL) + memcpy(&servers4[i4++],&addr4,sizeof(in_addr)); } @@ -284,7 +285,7 @@ s_connection *dns_add_query(s_header *h) } if (s->fd == -1) { - delete s; + DELETE(s); return NULL; } /* create new connection object, add to linked list */ @@ -351,7 +352,7 @@ in_addr* DNS::dns_aton4_r(const char *ipstring) { /* ascii to numeric (reentrant ip = new in_addr; if(dns_aton4_s(ipstring,ip) == NULL) { - delete ip; + DELETE(ip); return NULL; } return ip; @@ -478,38 +479,38 @@ char* DNS::dns_getresult_s(const int cfd, char *res) { /* retrieve result of DNS dns_close(c->fd); if (l < 12) { - delete c; + DELETE(c); return NULL; } dns_fill_header(&h,buffer,l - 12); if (c->id[0] != h.id[0] || c->id[1] != h.id[1]) { log(DEBUG,"DNS: id mismatch on query"); - delete c; + DELETE(c); return NULL; /* ID mismatch */ } if ((h.flags1 & FLAGS1_MASK_QR) == 0) { log(DEBUG,"DNS: didnt get a query result"); - delete c; + DELETE(c); return NULL; } if ((h.flags1 & FLAGS1_MASK_OPCODE) != 0) { log(DEBUG,"DNS: got an OPCODE and didnt want one"); - delete c; + DELETE(c); return NULL; } if ((h.flags2 & FLAGS2_MASK_RCODE) != 0) { log(DEBUG,"DNS lookup failed due to SERVFAIL"); - delete c; + DELETE(c); return NULL; } if (h.ancount < 1) { log(DEBUG,"DNS: no answers!"); - delete c; + DELETE(c); return NULL; } i = 0; @@ -555,7 +556,7 @@ char* DNS::dns_getresult_s(const int cfd, char *res) { /* retrieve result of DNS } if (l - i < 10) { - delete c; + DELETE(c); return NULL; } dns_fill_rr(&rr,&h.payload[i]); @@ -626,7 +627,7 @@ char* DNS::dns_getresult_s(const int cfd, char *res) { /* retrieve result of DNS break; if (rr.rdlength != 4) { - delete c; + DELETE(c); return NULL; } memcpy(&alist->ip,&h.payload[i],4); @@ -653,7 +654,7 @@ char* DNS::dns_getresult_s(const int cfd, char *res) { /* retrieve result of DNS } if (l - i < 10) { - delete c; + DELETE(c); return NULL; } dns_fill_rr(&rr,&h.payload[i]); @@ -673,7 +674,7 @@ char* DNS::dns_getresult_s(const int cfd, char *res) { /* retrieve result of DNS res[rr.rdlength] = '\0'; break; } - delete c; + DELETE(c); return res; } @@ -683,13 +684,13 @@ DNS::DNS() log(DEBUG,"Create blank DNS"); } -DNS::DNS(std::string dnsserver) +DNS::DNS(const std::string &dnsserver) { dns_init_2(dnsserver.c_str()); - log(DEBUG,"Create DNS"); + log(DEBUG,"Create DNS with server '%s'",dnsserver.c_str()); } -void DNS::SetNS(std::string dnsserver) +void DNS::SetNS(const std::string &dnsserver) { dns_init_2(dnsserver.c_str()); log(DEBUG,"Set NS"); @@ -699,30 +700,33 @@ DNS::~DNS() { } -bool DNS::ReverseLookup(std::string ip) +bool DNS::ReverseLookup(const std::string &ip) { - ServerInstance->stats->statsDns++; - binip = dns_aton4(ip.c_str()); - if (binip == NULL) + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDns++; + binip = dns_aton4(ip.c_str()); + if (binip == NULL) { - return false; - } + return false; + } - this->myfd = dns_getname4(binip); + this->myfd = dns_getname4(binip); if (this->myfd == -1) { return false; } log(DEBUG,"DNS: ReverseLookup, fd=%d",this->myfd); #ifndef THREADED_DNS - ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS); + if (ServerInstance && ServerInstance->SE) + ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS); #endif return true; } -bool DNS::ForwardLookup(std::string host) +bool DNS::ForwardLookup(const std::string &host) { - ServerInstance->stats->statsDns++; + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDns++; this->myfd = dns_getip4(host.c_str()); if (this->myfd == -1) { @@ -730,11 +734,28 @@ bool DNS::ForwardLookup(std::string host) } log(DEBUG,"DNS: ForwardLookup, fd=%d",this->myfd); #ifndef THREADED_DNS - ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS); + if (ServerInstance && ServerInstance->SE) + ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_DNS); #endif return true; } +bool DNS::ForwardLookupWithFD(const std::string &host, int &fd) +{ + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDns++; + this->myfd = dns_getip4(host.c_str()); + fd = this->myfd; + if (this->myfd == -1) + { + return false; + } + log(DEBUG,"DNS: ForwardLookupWithFD, fd=%d",this->myfd); + if (ServerInstance && ServerInstance->SE) + ServerInstance->SE->AddFd(this->myfd,true,X_ESTAB_MODULE); + return true; +} + bool DNS::HasResult(int fd) { return (fd == this->myfd); @@ -763,16 +784,18 @@ int DNS::GetFD() std::string DNS::GetResult() { log(DEBUG,"DNS: GetResult()"); - result = dns_getresult(this->myfd); - if (result) + result = dns_getresult(this->myfd); + if (result) { - ServerInstance->stats->statsDnsGood++; + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDnsGood++; dns_close(this->myfd); return result; - } + } else { - ServerInstance->stats->statsDnsBad++; + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDnsBad++; if (this->myfd != -1) { dns_close(this->myfd); @@ -792,7 +815,8 @@ std::string DNS::GetResultIP() } if (result) { - ServerInstance->stats->statsDnsGood++; + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDnsGood++; unsigned char a = (unsigned)result[0]; unsigned char b = (unsigned)result[1]; unsigned char c = (unsigned)result[2]; @@ -802,7 +826,8 @@ std::string DNS::GetResultIP() } else { - ServerInstance->stats->statsDnsBad++; + if (ServerInstance && ServerInstance->stats) + ServerInstance->stats->statsDnsBad++; log(DEBUG,"DANGER WILL ROBINSON! NXDOMAIN for forward lookup, but we got a reverse lookup!"); return ""; } @@ -813,40 +838,40 @@ std::string DNS::GetResultIP() #ifdef THREADED_DNS void* dns_task(void* arg) { - userrec* u = (userrec*)arg; - log(DEBUG,"DNS thread for user %s",u->nick); - DNS dns1; - DNS dns2; - std::string host; - std::string ip; - if (dns1.ReverseLookup(u->ip)) - { - while (!dns1.HasResult()) - { - usleep(100); - } - host = dns1.GetResult(); - if (host != "") - { - if (dns2.ForwardLookup(host)) - { - while (!dns2.HasResult()) - { - usleep(100); - } - ip = dns2.GetResultIP(); - if (ip == std::string(u->ip)) - { - if (host.length() < 160) - { - strcpy(u->host,host.c_str()); - strcpy(u->dhost,host.c_str()); - } - } - } - } - } - u->dns_done = true; - return NULL; + userrec* u = (userrec*)arg; + log(DEBUG,"DNS thread for user %s",u->nick); + DNS dns1; + DNS dns2; + std::string host; + std::string ip; + if (dns1.ReverseLookup((char*)inet_ntoa(u->ip4))) + { + while (!dns1.HasResult()) + { + usleep(100); + } + host = dns1.GetResult(); + if (host != "") + { + if (dns2.ForwardLookup(host)) + { + while (!dns2.HasResult()) + { + usleep(100); + } + ip = dns2.GetResultIP(); + if (ip == std::string((char*)inet_ntoa(u->ip4))) + { + if (host.length() < 160) + { + strcpy(u->host,host.c_str()); + strcpy(u->dhost,host.c_str()); + } + } + } + } + } + u->dns_done = true; + return NULL; } #endif