mirror of
https://github.com/nmap/nmap.git
synced 2025-12-24 00:19:01 +00:00
Actually use the interface address when get_srcaddr fails.
There was an embarrasing bug here added in r28874. In the second of three calls to get_srcaddr, the interface was being indexed by an index variable that, in this place, was actually an index into the routes table. This would in general produce a nonsensical source address or out-of-bounds access. The symptom of this problem was the following error messages: get_srcaddr: can't connect socket: The requested address is not valid in its context. Failed to convert source address to presentation format!?! Error: Unknown error The first showed that get_srcaddr failed, and the second was caused by the bogus source address. http://seclists.org/nmap-dev/2012/q3/859 http://seclists.org/nmap-dev/2012/q4/59
This commit is contained in:
@@ -3360,7 +3360,7 @@ static int route_dst_generic(const struct sockaddr_storage *dst,
|
||||
/* But the source address we want to use is the target address. */
|
||||
if (!spoofss) {
|
||||
if (get_srcaddr(dst, &rnfo->srcaddr) == -1)
|
||||
rnfo->srcaddr = ifaces[i].addr;
|
||||
rnfo->srcaddr = rnfo->ii.addr;
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -3385,7 +3385,7 @@ static int route_dst_generic(const struct sockaddr_storage *dst,
|
||||
sockaddr_equal(&routes[i].gw, dst));
|
||||
if (!spoofss) {
|
||||
if (get_srcaddr(dst, &rnfo->srcaddr) == -1)
|
||||
rnfo->srcaddr = ifaces[i].addr;
|
||||
rnfo->srcaddr = rnfo->ii.addr;
|
||||
}
|
||||
rnfo->nexthop = routes[i].gw;
|
||||
|
||||
@@ -3403,7 +3403,7 @@ static int route_dst_generic(const struct sockaddr_storage *dst,
|
||||
rnfo->direct_connect = 1;
|
||||
if (!spoofss) {
|
||||
if (get_srcaddr(dst, &rnfo->srcaddr) == -1)
|
||||
rnfo->srcaddr = ifaces[i].addr;
|
||||
rnfo->srcaddr = rnfo->ii.addr;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
Reference in New Issue
Block a user