1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 12:41:29 +00:00

Fixed scanning the same IP multiple times with a type of scan that is now raw, incompleteHosts and completedHosts are now multisets instead of sets

This commit is contained in:
tudor
2016-10-15 22:26:43 +00:00
parent fbc9ddae92
commit 9c8a435bbf
3 changed files with 15 additions and 15 deletions

View File

@@ -760,7 +760,7 @@ UltraScanInfo::UltraScanInfo() {
}
UltraScanInfo::~UltraScanInfo() {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
for (hostI = incompleteHosts.begin(); hostI != incompleteHosts.end(); hostI++) {
delete *hostI;
@@ -819,7 +819,7 @@ HostScanStats *UltraScanInfo::nextIncompleteHost() {
/* Return a number between 0.0 and 1.0 inclusive indicating how much of the scan
is done. */
double UltraScanInfo::getCompletionFraction() {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
double total;
/* Add 1 for each completed host. */
@@ -1076,7 +1076,7 @@ unsigned int UltraScanInfo::numProbesPerHost() {
bool UltraScanInfo::sendOK(struct timeval *when) {
struct timeval lowhtime = {0};
struct timeval tmptv;
std::set<HostScanStats *>::iterator host;
std::multiset<HostScanStats *>::iterator host;
bool ggood = false;
bool thisHostGood = false;
bool foundgood = false;
@@ -1134,7 +1134,7 @@ bool UltraScanInfo::sendOK(struct timeval *when) {
/* Find a HostScanStats by its IP address in the incomplete and completed lists.
Returns NULL if none are found. */
HostScanStats *UltraScanInfo::findHost(struct sockaddr_storage *ss) {
std::set<HostScanStats *>::iterator hss;
std::multiset<HostScanStats *>::iterator hss;
HssPredicate::ss = ss;
HostScanStats *fakeHss = NULL;
@@ -1160,7 +1160,7 @@ HostScanStats *UltraScanInfo::findHost(struct sockaddr_storage *ss) {
is here to replace numIncompleteHosts() < n, which would have to walk
through the entire list. */
bool UltraScanInfo::numIncompleteHostsLessThan(unsigned int n) {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
unsigned int count;
count = 0;
@@ -1180,7 +1180,7 @@ static bool pingprobe_is_better(const probespec *new_probe, int new_state,
list, and remove any hosts from completedHosts which have exceeded their
lifetime. Returns the number of hosts removed. */
int UltraScanInfo::removeCompletedHosts() {
std::set<HostScanStats *>::iterator hostI, nxt;
std::multiset<HostScanStats *>::iterator hostI, nxt;
HostScanStats *hss = NULL;
int hostsRemoved = 0;
bool timedout = false;
@@ -2290,7 +2290,7 @@ static void sendGlobalPingProbe(UltraScanInfo *USI) {
}
static void doAnyPings(UltraScanInfo *USI) {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
HostScanStats *hss = NULL;
gettimeofday(&USI->now, NULL);
@@ -2365,7 +2365,7 @@ static void retransmitProbe(UltraScanInfo *USI, HostScanStats *hss,
/* Go through the ProbeQueue of each host, identify any
timed out probes, then try to retransmit them as appropriate */
static void doAnyOutstandingRetransmits(UltraScanInfo *USI) {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
std::list<UltraProbe *>::iterator probeI;
/* A cache of the last processed probe from each host, to avoid re-examining a
bunch of probes to find the next one that needs to be retransmitted. */
@@ -2445,7 +2445,7 @@ static void doAnyOutstandingRetransmits(UltraScanInfo *USI) {
/* Print occasional remaining time estimates, as well as
debugging information */
static void printAnyStats(UltraScanInfo *USI) {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
HostScanStats *hss;
struct ultra_timing_vals hosttm;
@@ -2515,7 +2515,7 @@ static void waitForResponses(UltraScanInfo *USI) {
/* Go through the data structures, making appropriate changes (such as expiring
probes, noting when hosts are complete, etc. */
static void processData(UltraScanInfo *USI) {
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
std::list<UltraProbe *>::iterator probeI, nextProbeI;
HostScanStats *host = NULL;
UltraProbe *probe = NULL;

View File

@@ -738,11 +738,11 @@ public:
/* Any function which messes with (removes elements from)
incompleteHosts may have to manipulate nextI */
std::set<HostScanStats *, HssPredicate> incompleteHosts;
std::multiset<HostScanStats *, HssPredicate> incompleteHosts;
/* Hosts are moved from incompleteHosts to completedHosts as they are
completed. We keep them around because sometimes responses come back very
late, after we consider a host completed. */
std::set<HostScanStats *, HssPredicate> completedHosts;
std::multiset<HostScanStats *, HssPredicate> completedHosts;
/* How long (in msecs) we keep a host in completedHosts */
unsigned int completedHostLifetime;
/* The last time we went through completedHosts to remove hosts */
@@ -759,7 +759,7 @@ public:
private:
unsigned int numInitialTargets;
std::set<HostScanStats *>::iterator nextI;
std::multiset<HostScanStats *>::iterator nextI;
};

View File

@@ -489,7 +489,7 @@ bool do_one_select_round(UltraScanInfo *USI, struct timeval *stime) {
int timeleft;
ConnectScanInfo *CSI = USI->gstats->CSI;
int sd;
std::set<HostScanStats *>::iterator hostI;
std::multiset<HostScanStats *>::iterator hostI;
HostScanStats *host;
UltraProbe *probe = NULL;
int optval;
@@ -530,7 +530,7 @@ bool do_one_select_round(UltraScanInfo *USI, struct timeval *stime) {
and find the relevant ones. Note the peculiar structure of the loop--we
iterate through both incompleteHosts and completedHosts, because global
timing pings are sent to hosts in completedHosts. */
std::set<HostScanStats *>::iterator incompleteHostI, completedHostI;
std::multiset<HostScanStats *>::iterator incompleteHostI, completedHostI;
incompleteHostI = USI->incompleteHosts.begin();
completedHostI = USI->completedHosts.begin();
while ((incompleteHostI != USI->incompleteHosts.end()