1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-23 07:59:03 +00:00

Unconditionally set the port state to PORT_OPEN when receiving a service

scan response, instead of checking for a current state of
PORT_OPENFILTERED. The code calls getPortState, but the port may not
have been assigned a state, again because of the new Port allocation
architecture, so the function returns -1.

It would make sense to have getPortState return the default port state
if a Port has not been allocated, but there are two other places it is
used where the code relies on it returning -1 to indicate that a port
has not received a state yet.
This commit is contained in:
david
2010-01-23 02:01:50 +00:00
parent 12ccaa7786
commit 4c57d3f8c8
2 changed files with 15 additions and 12 deletions

View File

@@ -533,6 +533,9 @@ void PortList::setPortState(u16 portno, u8 protocol, int state) {
return;
}
/* Return the current port state, if a Port has been allocated for this port.
Returns -1 if the port hasn't had anything about it set yet--in particular,
this function does not return the default port state by default. */
int PortList::getPortState(u16 portno, u8 protocol) {
const Port *port;

View File

@@ -1693,25 +1693,25 @@ ServiceGroup::~ServiceGroup() {
delete SPM;
}
/* Called if data is read for a service or a TCP connection made. If
the port state is currently PORT_UNFILTERED, changes to
PORT_OPEN. */
/* Called if data is read for a service or a TCP connection made. Sets the port
state to PORT_OPEN. */
static void adjustPortStateIfNeccessary(ServiceNFO *svc) {
int oldstate;
char host[128];
if (svc->target->ports.getPortState(svc->portno, svc->proto) == PORT_OPENFILTERED) {
oldstate = svc->target->ports.getPortState(svc->portno, svc->proto);
svc->target->ports.setPortState(svc->portno, svc->proto, PORT_OPEN);
if (svc->proto == IPPROTO_TCP)
svc->target->ports.setStateReason(svc->portno, svc->proto, ER_TCPRESPONSE, 0, 0);
if (svc->proto == IPPROTO_UDP)
svc->target->ports.setStateReason(svc->portno, svc->proto, ER_UDPRESPONSE, 0, 0);
if (oldstate != PORT_OPEN) {
if (o.verbose || o.debugging > 1) {
svc->target->NameIP(host, sizeof(host));
log_write(LOG_STDOUT, "Discovered open|filtered port %hu/%s on %s is actually open\n",
svc->portno, proto2ascii(svc->proto), host);
log_write(LOG_STDOUT, "Discovered %s port %hu/%s on %s is actually open\n",
statenum2str(oldstate), svc->portno, proto2ascii(svc->proto), host);
log_flush(LOG_STDOUT);
}
}