1
0
mirror of https://github.com/nmap/nmap.git synced 2026-01-20 21:29:06 +00:00

devname2ipaddr now requires address family, so correct addr is returned.

This commit is contained in:
dmiller
2024-06-20 20:14:30 +00:00
parent 32c1272bfa
commit b63eea5eea
6 changed files with 5 additions and 52 deletions

View File

@@ -1436,7 +1436,7 @@ int ipaddr2devname(char *dev, const struct sockaddr_storage *addr) {
return -1;
}
int devname2ipaddr(char *dev, struct sockaddr_storage *addr) {
int devname2ipaddr(char *dev, int af, struct sockaddr_storage *addr) {
struct interface_info *ifaces;
int numifaces;
int i;
@@ -1446,7 +1446,7 @@ int devname2ipaddr(char *dev, struct sockaddr_storage *addr) {
return -1;
for (i = 0; i < numifaces; i++) {
if (!strcmp(dev, ifaces[i].devfullname)) {
if (af == ifaces[i].addr.ss_family && !strcmp(dev, ifaces[i].devfullname)) {
*addr = ifaces[i].addr;
return 0;
}

View File

@@ -318,7 +318,7 @@ int ipaddr2devname( char *dev, const struct sockaddr_storage *addr );
/* Convert a network interface name (IE ppp0 eth0) to an IP address.
* Returns 0 on success or -1 in case of error. */
int devname2ipaddr(char *dev, struct sockaddr_storage *addr);
int devname2ipaddr(char *dev, int af, struct sockaddr_storage *addr);
int sockaddr_equal(const struct sockaddr_storage *a,
const struct sockaddr_storage *b);

View File

@@ -1729,7 +1729,7 @@ void apply_delayed_options() {
if (*o.device && !o.SourceSockAddr()) {
struct sockaddr_storage tmpsock;
memset(&tmpsock, 0, sizeof(tmpsock));
if (devname2ipaddr(o.device, &tmpsock) == -1) {
if (devname2ipaddr(o.device, o.af(), &tmpsock) == -1) {
fatal("I cannot figure out what source address to use for device %s, does it even exist?", o.device);
}
o.setSourceSockAddr(&tmpsock, sizeof(tmpsock));

View File

@@ -1416,7 +1416,6 @@ struct sockaddr_storage *NpingOps::getSourceSockAddr(struct sockaddr_storage *ss
s6->sin6_addr=this->getIPv6SourceAddress();
else
s6->sin6_addr=in6addr_any;
s6->sin6_addr=this->getIPv6SourceAddress();
s6->sin6_family=AF_INET6;
if(this->issetSourcePort())
s6->sin6_port=htons(this->getSourcePort());
@@ -2392,7 +2391,7 @@ if( this->getMode()!=TCP_CONNECT && this->getMode()!=UDP_UNPRIV && this->getRole
else
this->setDevice( dev );
/* Libpcap gave us a device name, try to obtain it's IP */
if ( devname2ipaddr_alt(this->getDevice(), &ifaddr) != 0 ){
if ( devname2ipaddr(this->getDevice(), this->af(), &ifaddr) != 0 ){
if( this->isRoot() )
nping_fatal(QT_3,"Cannot figure out what source address to use for device %s, does it even exist?", this->getDevice());
else

View File

@@ -736,48 +736,3 @@ void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int *portwarning)
#ifndef IPPROTO_SCTP
#define IPPROTO_SCTP 132
#endif
/* IPv6 compatible version of Nmap's devname2ipaddr()
* @warning For this to work we need getinterfaces() not to skip IPv6 */
int devname2ipaddr_alt(char *dev, struct sockaddr_storage *addr) {
struct interface_info *mydevs;
struct sockaddr_storage *s=NULL;
struct sockaddr_in *s4=NULL;
struct sockaddr_in6 *s6=NULL;
int numdevs;
int i;
mydevs = getinterfaces(&numdevs, NULL, 0);
if (!mydevs) return -1;
if( !addr || !dev )
fatal("devname2ipaddr(): NULL values supplied.");
for(i=0; i < numdevs; i++) {
s=(struct sockaddr_storage *)&mydevs[i].addr;
s4=(struct sockaddr_in *)&mydevs[i].addr;
s6=(struct sockaddr_in6 *)&mydevs[i].addr;
if (s4->sin_family==AF_INET || s6->sin6_family==AF_INET6){
if (!strcmp(dev, mydevs[i].devfullname)) {
memcpy(addr, s, sizeof(struct sockaddr_storage));
return 0;
}
} else{ /* Unknown family, skipping it... */
continue;
}
}
return -1;
} /* End of devname2ipaddr() */

View File

@@ -135,7 +135,6 @@ class TargetGroup {
/*****************************************************************************
* STUFF FROM tcpip.cc
****************************************************************************/
int devname2ipaddr_alt(char *dev, struct sockaddr_storage *addr);
void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int *portwarning);
#endif