mirror of
https://github.com/pocoproject/poco.git
synced 2025-04-02 09:49:48 +02:00
fixed a crash due to invalid sockaddr cast
This commit is contained in:
parent
4d0eeb257e
commit
15fa335343
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user