fixed a crash due to invalid sockaddr cast

This commit is contained in:
Günter Obiltschnig 2020-01-22 10:59:02 +01:00
parent 4d0eeb257e
commit 15fa335343

View File

@ -794,9 +794,9 @@ bool NetworkInterface::isUp() const
NetworkInterface NetworkInterface::forName(const std::string& name, bool requireIPv6) NetworkInterface NetworkInterface::forName(const std::string& name, bool requireIPv6)
{ {
if (requireIPv6) if (requireIPv6)
return forName(name, IPv6_ONLY); return forName(name, IPv6_ONLY);
else else
return forName(name, IPv4_OR_IPv6); return forName(name, IPv4_OR_IPv6);
} }
@ -1067,7 +1067,7 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
throw SystemException(format("An error occurred while trying to obtain list of network interfaces: [%s]", Error::getMessage(dwRetVal))); throw SystemException(format("An error occurred while trying to obtain list of network interfaces: [%s]", Error::getMessage(dwRetVal)));
else else
break; break;
} }
while ((ERROR_BUFFER_OVERFLOW == dwRetVal) && (++iterations <= 2)); while ((ERROR_BUFFER_OVERFLOW == dwRetVal) && (++iterations <= 2));
poco_assert (NO_ERROR == dwRetVal); poco_assert (NO_ERROR == dwRetVal);
@ -1240,7 +1240,7 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
{ {
ifIt->second.addAddress(address); ifIt->second.addAddress(address);
} }
} }
break; break;
#if defined(POCO_HAVE_IPv6) #if defined(POCO_HAVE_IPv6)
case AF_INET6: case AF_INET6:
@ -1357,14 +1357,17 @@ NetworkInterface::Type fromNative(u_char nativeType)
void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl) void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
{ {
struct sockaddr_dl* sdl = (struct sockaddr_dl*) iface->ifa_addr;
impl.setName(iface->ifa_name); impl.setName(iface->ifa_name);
impl.setDisplayName(iface->ifa_name); impl.setDisplayName(iface->ifa_name);
impl.setAdapterName(iface->ifa_name); impl.setAdapterName(iface->ifa_name);
impl.setPhyParams(); impl.setPhyParams();
impl.setMACAddress(LLADDR(sdl), sdl->sdl_alen); if (iface->ifa_addr->sa_family == AF_LINK)
impl.setType(fromNative(sdl->sdl_type)); {
struct sockaddr_dl* sdl = (struct sockaddr_dl*) iface->ifa_addr;
impl.setMACAddress(LLADDR(sdl), sdl->sdl_alen);
impl.setType(fromNative(sdl->sdl_type));
}
} }
@ -1536,16 +1539,19 @@ void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
impl.setPhyParams(); impl.setPhyParams();
#ifndef POCO_NO_LINUX_IF_PACKET_H #ifndef POCO_NO_LINUX_IF_PACKET_H
struct sockaddr_ll* sdl = (struct sockaddr_ll*) iface->ifa_addr; if (iface->ifa_addr->sa_family == AF_PACKET)
impl.setMACAddress(sdl->sll_addr, sdl->sll_halen); {
impl.setType(fromNative(sdl->sll_hatype)); struct sockaddr_ll* sdl = (struct sockaddr_ll*) iface->ifa_addr;
impl.setMACAddress(sdl->sll_addr, sdl->sll_halen);
impl.setType(fromNative(sdl->sll_hatype));
}
#else #else
std::string ifPath("/sys/class/net/"); std::string ifPath("/sys/class/net/");
ifPath += iface->ifa_name; ifPath += iface->ifa_name;
std::string addrPath(ifPath); std::string addrPath(ifPath);
addrPath += "/address"; addrPath += "/address";
std::ifstream addrStream(addrPath.c_str()); std::ifstream addrStream(addrPath.c_str());
if (addrStream.good()) if (addrStream.good())
{ {
@ -1560,7 +1566,7 @@ void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl)
impl.setMACAddress(&mac[0], mac.size()); impl.setMACAddress(&mac[0], mac.size());
addrStream.close(); addrStream.close();
} }
std::string typePath(ifPath); std::string typePath(ifPath);
typePath += "/type"; typePath += "/type";
std::ifstream typeStream(typePath.c_str()); std::ifstream typeStream(typePath.c_str());