From 043f5d3eb52587831f643bc52c95079c36d984c7 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 2 Dec 2015 10:27:54 -0800 Subject: QNetworkInterface: fix handling of interfaces with no addresses Certain Linux interfaces have no addresses at all (hardware or IP), like the nlmon interfaces. They weren't being reported. Change-Id: I8de47ed6c7be4847b99bffff141c2b60c2089ad3 Reviewed-by: Richard J. Moore --- src/network/kernel/qnetworkinterface_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/network/kernel/qnetworkinterface_unix.cpp') diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index 5e6d24dd44..b734476dc2 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -343,7 +343,7 @@ static QList createInterfaces(ifaddrs *rawList) // - virtual interfaces with no HW address have no AF_PACKET // - interface labels have no AF_PACKET, but shouldn't be shown as a new interface for (ifaddrs *ptr = rawList; ptr; ptr = ptr->ifa_next) { - if (ptr->ifa_addr && ptr->ifa_addr->sa_family != AF_PACKET) { + if (!ptr->ifa_addr || ptr->ifa_addr->sa_family != AF_PACKET) { QString name = QString::fromLatin1(ptr->ifa_name); if (seenInterfaces.contains(name)) continue; -- cgit v1.2.3 From 8cd67bbfac5783cd77f1e0617dc4c938dfd44229 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 2 Dec 2015 12:37:06 -0800 Subject: QNetworkInterface: don't add a QNetworkAddressEntry if no IP is known If SIOCGIFADDR fails, then don't bother trying to get the broadcast address or netmask, and especially don't add the empty QNetworkAddressEntry to the interface. This can happen on interfaces that have no IP address assigned (for example, inactive interfaces). Change-Id: I8de47ed6c7be4847b99bffff141c326d94ecca78 Reviewed-by: Richard J. Moore --- src/network/kernel/qnetworkinterface_unix.cpp | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/network/kernel/qnetworkinterface_unix.cpp') diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index b734476dc2..eb73a2fb18 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -268,29 +268,29 @@ static QList interfaceListing() } #endif - // Get the interface broadcast address - QNetworkAddressEntry entry; - if (iface->flags & QNetworkInterface::CanBroadcast) { - if (qt_safe_ioctl(socket, SIOCGIFBRDADDR, &req) >= 0) { - sockaddr *sa = &req.ifr_addr; - if (sa->sa_family == AF_INET) - entry.setBroadcast(addressFromSockaddr(sa)); - } - } - // Get the address of the interface + QNetworkAddressEntry entry; if (qt_safe_ioctl(socket, SIOCGIFADDR, &req) >= 0) { sockaddr *sa = &req.ifr_addr; entry.setIp(addressFromSockaddr(sa)); - } - // Get the interface netmask - if (qt_safe_ioctl(socket, SIOCGIFNETMASK, &req) >= 0) { - sockaddr *sa = &req.ifr_addr; - entry.setNetmask(addressFromSockaddr(sa)); - } + // Get the interface broadcast address + if (iface->flags & QNetworkInterface::CanBroadcast) { + if (qt_safe_ioctl(socket, SIOCGIFBRDADDR, &req) >= 0) { + sockaddr *sa = &req.ifr_addr; + if (sa->sa_family == AF_INET) + entry.setBroadcast(addressFromSockaddr(sa)); + } + } - iface->addressEntries << entry; + // Get the interface netmask + if (qt_safe_ioctl(socket, SIOCGIFNETMASK, &req) >= 0) { + sockaddr *sa = &req.ifr_addr; + entry.setNetmask(addressFromSockaddr(sa)); + } + + iface->addressEntries << entry; + } } ::close(socket); -- cgit v1.2.3