diff --git a/nmap_dns.cc b/nmap_dns.cc index 6b8bb5d9d..45d461311 100644 --- a/nmap_dns.cc +++ b/nmap_dns.cc @@ -426,7 +426,7 @@ protected: u16 DNS::Factory::progressiveId = get_random_u16(); static std::list servs; static std::list new_reqs; -static std::list cname_reqs; +static std::list deferred_reqs; static std::map records; static int total_reqs; static nsock_pool dnspool=NULL; @@ -443,11 +443,11 @@ static ScanProgressMeter *SPM; //------------------- Prototypes and macros --------------------- - +static void read_evt_handler(nsock_pool, nsock_event, void *); static void put_dns_packet_on_wire(request *req); #define ACTION_FINISHED 0 -#define ACTION_CNAME_LIST 1 +#define ACTION_SYSTEM_RESOLVE 1 #define ACTION_TIMEOUT 2 //------------------- Misc code --------------------- @@ -660,7 +660,7 @@ static int process_result(const sockaddr_storage &ip, const std::string &result, if( !result.empty() && !sockaddr_storage_equal(&ip, tpreq->targ->TargetSockAddr()) ) return 0; - if (action == ACTION_CNAME_LIST || action == ACTION_FINISHED) + if (action == ACTION_SYSTEM_RESOLVE || action == ACTION_FINISHED) { server->capacity += CAPACITY_UP_STEP; check_capacities(&*server); @@ -677,7 +677,7 @@ static int process_result(const sockaddr_storage &ip, const std::string &result, total_reqs--; - if (action == ACTION_CNAME_LIST) cname_reqs.push_back(tpreq); + if (action == ACTION_SYSTEM_RESOLVE) deferred_reqs.push_back(tpreq); if (action == ACTION_FINISHED) delete tpreq; } else @@ -755,11 +755,10 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) { return; } - // If there is no error and no answer stop processing the event - if(p.answers.empty()) return; + bool processing_successful = false; for(std::list::const_iterator it = p.answers.begin(); - it != p.answers.end(); ++it ) + it != p.answers.end() && !processing_successful; ++it ) { const DNS::Answer &a = *it; if(a.record_class == DNS::CLASS_IN) @@ -772,7 +771,8 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) { sockaddr_storage ip; if(DNS::Factory::ptrToIp(a.name, ip)) - if (process_result(ip, ptr->value, ACTION_FINISHED, p.id)) + { + if ((processing_successful = process_result(ip, ptr->value, ACTION_FINISHED, p.id))) { if (o.debugging >= TRACE_DEBUG_LEVEL) { @@ -785,6 +785,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) { output_summary(); stat_ok++; } + } break; } case DNS::CNAME: @@ -798,7 +799,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) { sockaddr_storage_iptop(&ip, ipstr); log_write(LOG_STDOUT, "mass_rdns: CNAME found for <%s>\n", ipstr); } - process_result(ip, "", ACTION_CNAME_LIST, p.id); + processing_successful = process_result(ip, "", ACTION_SYSTEM_RESOLVE, p.id); } break; } @@ -807,6 +808,18 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) { } } } + + if (!processing_successful) { + if (DNS_HAS_FLAG(f, DNS::TRUNCATED)) { + sockaddr_storage discard; + process_result(discard, "", ACTION_SYSTEM_RESOLVE, p.id); + } + else { + if (o.debugging >= TRACE_DEBUG_LEVEL) { + log_write(LOG_STDOUT, "mass_rdns: Unable to process the response\n"); + } + } + } } @@ -1156,7 +1169,7 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) { connect_dns_servers(); - cname_reqs.clear(); + deferred_reqs.clear(); read_timeout_index = MIN(sizeof(read_timeouts)/sizeof(read_timeouts[0]), servs.size()) - 1; @@ -1183,20 +1196,20 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) { nsock_pool_delete(dnspool); - if (cname_reqs.size() && o.debugging) - log_write(LOG_STDOUT, "Performing system-dns for %d domain names that use CNAMEs\n", (int) cname_reqs.size()); + if (deferred_reqs.size() && o.debugging) + log_write(LOG_STDOUT, "Performing system-dns for %d domain names that were deferred\n", (int) deferred_reqs.size()); - if (cname_reqs.size()) { - Snprintf(spmobuf, sizeof(spmobuf), "System CNAME DNS resolution of %u host%s.", (unsigned) cname_reqs.size(), cname_reqs.size()-1 ? "s" : ""); + if (deferred_reqs.size()) { + Snprintf(spmobuf, sizeof(spmobuf), "System DNS resolution of %u host%s.", (unsigned) deferred_reqs.size(), deferred_reqs.size()-1 ? "s" : ""); SPM = new ScanProgressMeter(spmobuf); - for(i=0, reqI = cname_reqs.begin(); reqI != cname_reqs.end(); reqI++, i++) { + for(i=0, reqI = deferred_reqs.begin(); reqI != deferred_reqs.end(); reqI++, i++) { struct sockaddr_storage ss; size_t sslen; char hostname[MAXHOSTNAMELEN + 1] = ""; if (keyWasPressed()) - SPM->printStats((double) i / cname_reqs.size(), NULL); + SPM->printStats((double) i / deferred_reqs.size(), NULL); tpreq = *reqI; @@ -1218,7 +1231,7 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) { delete SPM; } - cname_reqs.clear(); + deferred_reqs.clear(); }