mirror of
https://github.com/nmap/nmap.git
synced 2025-12-11 18:29:03 +00:00
Honor sin6_scope_id in route_dst_generic.
This is set nonzero when there is a scope identifier at the end of an IPv6 address, like fe80::a8bb:ccff:fedd:eeff%eth0. When this happens, we look up the interface by index and then act as if it was the interface given by -e. (But -e always has precedence over this.)
This commit is contained in:
@@ -3094,6 +3094,7 @@ static int route_dst_generic(const struct sockaddr_storage *dst,
|
|||||||
struct sys_route *routes;
|
struct sys_route *routes;
|
||||||
int numroutes = 0;
|
int numroutes = 0;
|
||||||
int i;
|
int i;
|
||||||
|
char namebuf[IFNAMSIZ];
|
||||||
char errstr[256];
|
char errstr[256];
|
||||||
errstr[0]='\0';
|
errstr[0]='\0';
|
||||||
|
|
||||||
@@ -3107,10 +3108,21 @@ static int route_dst_generic(const struct sockaddr_storage *dst,
|
|||||||
assert(device!=NULL && device[0]!='\0');
|
assert(device!=NULL && device[0]!='\0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if there is an interface scope on the address. */
|
||||||
|
if (device == NULL || device[0] == '\0') {
|
||||||
|
if (dst->ss_family == AF_INET6) {
|
||||||
|
const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) dst;
|
||||||
|
if (sin6->sin6_scope_id > 0) {
|
||||||
|
device = if_indextoname(sin6->sin6_scope_id, namebuf);
|
||||||
|
assert(device != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (device!=NULL && device[0]!='\0'){
|
if (device!=NULL && device[0]!='\0'){
|
||||||
iface = getInterfaceByName(device, dst->ss_family);
|
iface = getInterfaceByName(device, dst->ss_family);
|
||||||
if (!iface)
|
if (!iface)
|
||||||
netutil_fatal("Could not find interface %s which was specified by -e", device);
|
netutil_fatal("Could not find interface %s", device);
|
||||||
} else {
|
} else {
|
||||||
iface = NULL;
|
iface = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user