mirror of
https://github.com/nmap/nmap.git
synced 2025-12-07 13:11:28 +00:00
Start timeout clocks closer to first probe, not in batches. Closes #1150
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
#Nmap Changelog ($Id$); -*-text-*-
|
#Nmap Changelog ($Id$); -*-text-*-
|
||||||
|
|
||||||
|
o [GH#1150] Start host timeout clocks when the first probe is sent to a host,
|
||||||
|
not when the hostgroup is started. Sometimes a host doesn't get probes until
|
||||||
|
late in the hostgroup, increasing the chance it will time out. [jsiembida]
|
||||||
|
|
||||||
o [GH#1147][GH#1108] Reduced LibPCRE resource limits so that version detection
|
o [GH#1147][GH#1108] Reduced LibPCRE resource limits so that version detection
|
||||||
can't use as much of the stack. Previously Nmap could crash when run on
|
can't use as much of the stack. Previously Nmap could crash when run on
|
||||||
low-memory systems against target services which are intentionally or
|
low-memory systems against target services which are intentionally or
|
||||||
|
|||||||
18
osscan2.cc
18
osscan2.cc
@@ -455,19 +455,6 @@ const char *tsseqclass2ascii(int seqclass) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Start the timeout clocks of any targets that aren't already timedout */
|
|
||||||
static void startTimeOutClocks(OsScanInfo *OSI) {
|
|
||||||
std::list<HostOsScanInfo *>::iterator hostI;
|
|
||||||
|
|
||||||
gettimeofday(&now, NULL);
|
|
||||||
for (hostI = OSI->incompleteHosts.begin();
|
|
||||||
hostI != OSI->incompleteHosts.end(); hostI++) {
|
|
||||||
if (!(*hostI)->target->timedOut(NULL))
|
|
||||||
(*hostI)->target->startTimeOutClock(&now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Sets up the pcap descriptor in HOS (obtains a descriptor and sets the
|
/** Sets up the pcap descriptor in HOS (obtains a descriptor and sets the
|
||||||
* appropriate BPF filter, based on the supplied list of targets). */
|
* appropriate BPF filter, based on the supplied list of targets). */
|
||||||
static void begin_sniffer(HostOsScan *HOS, std::vector<Target *> &Targets) {
|
static void begin_sniffer(HostOsScan *HOS, std::vector<Target *> &Targets) {
|
||||||
@@ -1769,6 +1756,10 @@ void HostOsScan::sendNextProbe(HostOsScanStats *hss) {
|
|||||||
if (hss->probesToSend.empty())
|
if (hss->probesToSend.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!hss->target->timeOutClockRunning() && !hss->target->timedOut(NULL)) {
|
||||||
|
hss->target->startTimeOutClock(&now);
|
||||||
|
}
|
||||||
|
|
||||||
probeI = hss->probesToSend.begin();
|
probeI = hss->probesToSend.begin();
|
||||||
probe = *probeI;
|
probe = *probeI;
|
||||||
|
|
||||||
@@ -3729,7 +3720,6 @@ int OSScan::os_scan_ipv4(std::vector<Target *> &Targets) {
|
|||||||
return OP_FAILURE;
|
return OP_FAILURE;
|
||||||
}
|
}
|
||||||
OSI.starttime = o.TimeSinceStart();
|
OSI.starttime = o.TimeSinceStart();
|
||||||
startTimeOutClocks(&OSI);
|
|
||||||
|
|
||||||
HostOsScan HOS(Targets[0]);
|
HostOsScan HOS(Targets[0]);
|
||||||
|
|
||||||
|
|||||||
@@ -2035,6 +2035,15 @@ static bool ultrascan_host_pspec_update(UltraScanInfo *USI, HostScanStats *hss,
|
|||||||
return hss->target->flags != oldstate;
|
return hss->target->flags != oldstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ultrascan_host_timeout_init(UltraScanInfo *USI, HostScanStats *hss) {
|
||||||
|
if (!hss->target->timeOutClockRunning() && !hss->target->timedOut(NULL)) {
|
||||||
|
if (o.debugging > 2) {
|
||||||
|
log_write(LOG_STDOUT, "Ultrascan timeout init for %s at %.6f\n", hss->target->targetipstr(), TIMEVAL_SECS(USI->now));
|
||||||
|
}
|
||||||
|
hss->target->startTimeOutClock(&USI->now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Called when a new status is determined for host in hss (eg. it is
|
/* Called when a new status is determined for host in hss (eg. it is
|
||||||
found to be up or down by a ping/ping_arp scan. The probe that led
|
found to be up or down by a ping/ping_arp scan. The probe that led
|
||||||
to this new decision is in probeI. This function needs to update
|
to this new decision is in probeI. This function needs to update
|
||||||
@@ -2255,6 +2264,7 @@ static void doAnyNewProbes(UltraScanInfo *USI) {
|
|||||||
hss = USI->nextIncompleteHost();
|
hss = USI->nextIncompleteHost();
|
||||||
while (hss != NULL && hss != unableToSend && USI->gstats->sendOK(NULL)) {
|
while (hss != NULL && hss != unableToSend && USI->gstats->sendOK(NULL)) {
|
||||||
if (hss->freshPortsLeft() && hss->sendOK(NULL)) {
|
if (hss->freshPortsLeft() && hss->sendOK(NULL)) {
|
||||||
|
ultrascan_host_timeout_init(USI, hss);
|
||||||
sendNextScanProbe(USI, hss);
|
sendNextScanProbe(USI, hss);
|
||||||
unableToSend = NULL;
|
unableToSend = NULL;
|
||||||
} else if (unableToSend == NULL) {
|
} else if (unableToSend == NULL) {
|
||||||
@@ -2688,18 +2698,6 @@ static void processData(UltraScanInfo *USI) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start the timeout clocks of any targets that aren't already timedout */
|
|
||||||
static void startTimeOutClocks(std::vector<Target *> &Targets) {
|
|
||||||
struct timeval tv;
|
|
||||||
std::vector<Target *>::iterator hostI;
|
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
for (hostI = Targets.begin(); hostI != Targets.end(); hostI++) {
|
|
||||||
if (!(*hostI)->timedOut(NULL))
|
|
||||||
(*hostI)->startTimeOutClock(&tv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 3rd generation Nmap scanning function. Handles most Nmap port scan types.
|
/* 3rd generation Nmap scanning function. Handles most Nmap port scan types.
|
||||||
|
|
||||||
The parameter to gives group timing information, and if it is not NULL,
|
The parameter to gives group timing information, and if it is not NULL,
|
||||||
@@ -2730,7 +2728,6 @@ void ultra_scan(std::vector<Target *> &Targets, struct scan_lists *ports,
|
|||||||
// Set the variable for status printing
|
// Set the variable for status printing
|
||||||
o.numhosts_scanning = Targets.size();
|
o.numhosts_scanning = Targets.size();
|
||||||
|
|
||||||
startTimeOutClocks(Targets);
|
|
||||||
UltraScanInfo USI(Targets, ports, scantype);
|
UltraScanInfo USI(Targets, ports, scantype);
|
||||||
|
|
||||||
/* Use the requested timeouts. */
|
/* Use the requested timeouts. */
|
||||||
|
|||||||
@@ -2324,6 +2324,9 @@ static int launchSomeServiceProbes(nsock_pool nsp, ServiceGroup *SG) {
|
|||||||
end_svcprobe(nsp, PROBESTATE_INCOMPLETE, SG, svc, NULL);
|
end_svcprobe(nsp, PROBESTATE_INCOMPLETE, SG, svc, NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (!svc->target->timeOutClockRunning()) {
|
||||||
|
svc->target->startTimeOutClock(nsock_gettimeofday());
|
||||||
|
}
|
||||||
nextprobe = svc->nextProbe(true);
|
nextprobe = svc->nextProbe(true);
|
||||||
|
|
||||||
if (nextprobe == NULL) {
|
if (nextprobe == NULL) {
|
||||||
@@ -2760,24 +2763,6 @@ std::list<ServiceNFO *>::iterator svc;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start the timeout clocks of any targets that have probes. Assumes
|
|
||||||
that this is called before any probes have been launched (so they
|
|
||||||
are all in services_remaining */
|
|
||||||
static void startTimeOutClocks(ServiceGroup *SG) {
|
|
||||||
std::list<ServiceNFO *>::iterator svcI;
|
|
||||||
Target *target = NULL;
|
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
for(svcI = SG->services_remaining.begin();
|
|
||||||
svcI != SG->services_remaining.end(); svcI++) {
|
|
||||||
target = (*svcI)->target;
|
|
||||||
if (!target->timeOutClockRunning())
|
|
||||||
target->startTimeOutClock(&tv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// We iterate through SG->services_remaining and remove any with port/protocol
|
// We iterate through SG->services_remaining and remove any with port/protocol
|
||||||
// pairs that are excluded. We use AP->isExcluded() to determine which ports
|
// pairs that are excluded. We use AP->isExcluded() to determine which ports
|
||||||
@@ -2837,8 +2822,6 @@ int service_scan(std::vector<Target *> &Targets) {
|
|||||||
remove_excluded_ports(AP, SG);
|
remove_excluded_ports(AP, SG);
|
||||||
}
|
}
|
||||||
|
|
||||||
startTimeOutClocks(SG);
|
|
||||||
|
|
||||||
if (SG->services_remaining.size() == 0) {
|
if (SG->services_remaining.size() == 0) {
|
||||||
delete SG;
|
delete SG;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user