Sfoglia il codice sorgente

Fix local ip addresses (interfaces) detection.

Ignore non-IP addresses for both windows and unix
Fabio Alessandrelli 8 anni fa
parent
commit
a1c41be569
1 ha cambiato i file con 11 aggiunte e 4 eliminazioni
  1. 11 4
      drivers/unix/ip_unix.cpp

+ 11 - 4
drivers/unix/ip_unix.cpp

@@ -77,7 +77,7 @@ static IP_Address _sockaddr2ip(struct sockaddr *p_addr) {
 	if (p_addr->sa_family == AF_INET) {
 		struct sockaddr_in *addr = (struct sockaddr_in *)p_addr;
 		ip.set_ipv4((uint8_t *)&(addr->sin_addr));
-	} else {
+	} else if (p_addr->sa_family == AF_INET6) {
 		struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)p_addr;
 		ip.set_ipv6(addr6->sin6_addr.s6_addr);
 	};
@@ -180,15 +180,16 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
 				SOCKADDR_IN *ipv4 = reinterpret_cast<SOCKADDR_IN *>(address->Address.lpSockaddr);
 
 				ip.set_ipv4((uint8_t *)&(ipv4->sin_addr));
-			} else { // ipv6
+				r_addresses->push_back(ip);
+
+			} else if (address->Address.lpSockaddr->sa_family == AF_INET6) { // ipv6
 
 				SOCKADDR_IN6 *ipv6 = reinterpret_cast<SOCKADDR_IN6 *>(address->Address.lpSockaddr);
 
 				ip.set_ipv6(ipv6->sin6_addr.s6_addr);
+				r_addresses->push_back(ip);
 			};
 
-			r_addresses->push_back(ip);
-
 			address = address->Next;
 		};
 		adapter = adapter->Next;
@@ -205,6 +206,7 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
 
 	struct ifaddrs *ifAddrStruct = NULL;
 	struct ifaddrs *ifa = NULL;
+	int family;
 
 	getifaddrs(&ifAddrStruct);
 
@@ -212,6 +214,11 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
 		if (!ifa->ifa_addr)
 			continue;
 
+		family = ifa->ifa_addr->sa_family;
+
+		if (family != AF_INET && family != AF_INET6)
+			continue;
+
 		IP_Address ip = _sockaddr2ip(ifa->ifa_addr);
 		r_addresses->push_back(ip);
 	}