diff options
author | Adriaan de Groot <adridg@FreeBSD.org> | 2018-12-25 00:46:16 +0800 |
---|---|---|
committer | Adriaan de Groot <adridg@FreeBSD.org> | 2018-12-25 00:46:16 +0800 |
commit | 578f803121ca48d30dc772cb33e9f973cffdb394 (patch) | |
tree | 607dec8ceacaf20a4673f1f1561aaf3779620e3d /net/qt5-network | |
parent | 99c3ec9c88e19d7a79936e69f748f98c4430f0be (diff) | |
download | freebsd-ports-gnome-578f803121ca48d30dc772cb33e9f973cffdb394.tar.gz freebsd-ports-gnome-578f803121ca48d30dc772cb33e9f973cffdb394.tar.zst freebsd-ports-gnome-578f803121ca48d30dc772cb33e9f973cffdb394.zip |
Fix net/qt5-network in the face of VLANs.
Adding a VLAN to a FreeBSD system caused memory corruption -- usually
enough to make rtld fall over with symbol resolution errors, although
in DEBUG builds it would just crash. Revamp network interface discovery
to not be full of memory gotcha's.
An explanation is included in the patches. While here, "make makesum"
has moved some files around.
PR: 231402, 233798, 232318
Reported by: Ting-Wei Lan, Nils Beyer, Marek Zarychta
Diffstat (limited to 'net/qt5-network')
-rw-r--r-- | net/qt5-network/Makefile | 1 | ||||
-rw-r--r-- | net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp | 99 | ||||
-rw-r--r-- | net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h (renamed from net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h) | 6 | ||||
-rw-r--r-- | net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp (renamed from net/qt5-network/files/patch-qsslcontext_openssl.cpp) | 6 | ||||
-rw-r--r-- | net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp | 42 |
5 files changed, 141 insertions, 13 deletions
diff --git a/net/qt5-network/Makefile b/net/qt5-network/Makefile index 3918871f81c0..ffaa7be45d62 100644 --- a/net/qt5-network/Makefile +++ b/net/qt5-network/Makefile @@ -2,6 +2,7 @@ PORTNAME= network DISTVERSION= ${QT5_VERSION} +PORTREVISION= 1 CATEGORIES= net ipv6 PKGNAMEPREFIX= qt5- diff --git a/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp b/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp index 73b6de7b682d..04d7b3019939 100644 --- a/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp +++ b/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp @@ -1,12 +1,95 @@ ---- src/network/kernel/qnetworkinterface_unix.cpp.orig 2018-06-15 07:29:31 UTC +Clean up interface type and MTU detection. + + - Introduce a class SockPuppet that handles closing the socket + automatically, and handles different address families as well. + - Finding MTU requires using AF_LOCAL, cribbed that detail from ifconfig.c + - Zero out structures more diligently, initialize pointers to nullptr. + - In particular, don't use a union of structs passed in to ioctl(). + Make them separate structs (with block scope so the compiler might + place them on top of each other, that would be ok). + +--- src/network/kernel/qnetworkinterface_unix.cpp.orig 2018-12-24 17:00:42 UTC +++ src/network/kernel/qnetworkinterface_unix.cpp -@@ -463,9 +463,6 @@ static QNetworkInterface::InterfaceType probeIfType(in - case IFM_ETHER: - return QNetworkInterface::Ethernet; +@@ -419,12 +419,23 @@ QT_BEGIN_INCLUDE_NAMESPACE + #endif // QT_PLATFORM_UIKIT + QT_END_INCLUDE_NAMESPACE -- case IFM_FDDI: -- return QNetworkInterface::Fddi; +-static int openSocket(int &socket) ++template<int address_family> struct SockPuppet + { +- if (socket == -1) +- socket = qt_safe_socket(AF_INET, SOCK_DGRAM, 0); +- return socket; +-} ++ int socket{-1}; ++ ++ int open() ++ { ++ if (socket == -1) ++ socket = qt_safe_socket(address_family, SOCK_DGRAM, 0); ++ return socket; ++ } ++ ++ ~SockPuppet() ++ { ++ if (socket != -1) ++ qt_safe_close(socket); ++ } ++} ; + + static QNetworkInterface::InterfaceType probeIfType(int socket, int iftype, struct ifmediareq *req) + { +@@ -477,15 +488,8 @@ static QNetworkInterface::InterfaceType + static QList<QNetworkInterfacePrivate *> createInterfaces(ifaddrs *rawList) + { + QList<QNetworkInterfacePrivate *> interfaces; +- union { +- struct ifmediareq mediareq; +- struct ifreq req; +- }; +- int socket = -1; - - case IFM_IEEE80211: - return QNetworkInterface::Ieee80211; +- // ensure both structs start with the name field, of size IFNAMESIZ +- Q_STATIC_ASSERT(sizeof(mediareq.ifm_name) == sizeof(req.ifr_name)); +- Q_ASSERT(&mediareq.ifm_name == &req.ifr_name); ++ SockPuppet<AF_INET> socket; ++ SockPuppet<AF_LOCAL> localSocket; + + // on NetBSD we use AF_LINK and sockaddr_dl + // scan the list for that family +@@ -500,13 +504,21 @@ static QList<QNetworkInterfacePrivate *> + iface->flags = convertFlags(ptr->ifa_flags); + iface->hardwareAddress = iface->makeHwAddress(sdl->sdl_alen, (uchar*)LLADDR(sdl)); + +- strlcpy(mediareq.ifm_name, ptr->ifa_name, sizeof(mediareq.ifm_name)); +- iface->type = probeIfType(openSocket(socket), sdl->sdl_type, &mediareq); +- iface->mtu = getMtu(socket, &req); ++ { ++ ifmediareq req; ++ memset(&req, 0, sizeof(req)); ++ strncpy(req.ifm_name, ptr->ifa_name, sizeof(req.ifm_name)); ++ iface->type = probeIfType(socket.open(), sdl->sdl_type, &req); ++ } ++ { ++ ifreq req; ++ memset(&req, 0, sizeof(req)); ++ strncpy(req.ifr_name, ptr->ifa_name, sizeof(req.ifr_name)); ++ req.ifr_addr.sa_family = AF_LOCAL; ++ iface->mtu = getMtu(localSocket.open(), &req); ++ } } + +- if (socket != -1) +- qt_safe_close(socket); + return interfaces; + } + +@@ -605,7 +617,7 @@ static QList<QNetworkInterfacePrivate *> + { + QList<QNetworkInterfacePrivate *> interfaces; + +- ifaddrs *interfaceListing; ++ ifaddrs *interfaceListing = nullptr; + if (getifaddrs(&interfaceListing) == -1) { + // error + return interfaces; diff --git a/net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h b/net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h index bd2643152c43..8e6ca284ab48 100644 --- a/net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h +++ b/net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h @@ -1,5 +1,7 @@ ---- src/network/socket/qnet_unix_p.h.orig 2018-08-27 06:31:41.917561000 +0200 -+++ src/network/socket/qnet_unix_p.h 2018-08-27 06:33:20.404588000 +0200 +Some extra includes for us. + +--- src/network/socket/qnet_unix_p.h.orig 2018-12-03 11:15:26 UTC ++++ src/network/socket/qnet_unix_p.h @@ -71,6 +71,12 @@ # include <resolv.h> #endif diff --git a/net/qt5-network/files/patch-qsslcontext_openssl.cpp b/net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp index c1202516d819..760df9a136af 100644 --- a/net/qt5-network/files/patch-qsslcontext_openssl.cpp +++ b/net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp @@ -1,10 +1,10 @@ * -* Fix for libressl atter openssl111 API change +* Fix for libressl after openssl111 API change * * ---- src/network/ssl/qsslcontext_openssl.cpp.orig 2018-10-21 16:58:39 UTC +--- src/network/ssl/qsslcontext_openssl.cpp.orig 2018-12-03 11:15:26 UTC +++ src/network/ssl/qsslcontext_openssl.cpp -@@ -248,7 +248,7 @@ void QSslContext::applyBackendConfig(QSs +@@ -249,7 +249,7 @@ void QSslContext::applyBackendConfig(QSs if (sslContext->sslConfiguration.backendConfiguration().isEmpty()) return; diff --git a/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp b/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp new file mode 100644 index 000000000000..57261fa16fd2 --- /dev/null +++ b/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp @@ -0,0 +1,42 @@ +Determine suitable bearer. This code is basically the same +as the Linux code, except out ioctl()s are named differently +and we need an AF_LOCAL socket (this detail cribbed from ifconfig.c). +If getting the HW address succeeds, assume it's Ethernet. Tested +with two Ethernet cards and a vlan (all of which have a MAC reported +by ifconfig). + +--- src/plugins/bearer/generic/qgenericengine.cpp.orig 2018-12-03 12:15:26.000000000 +0100 ++++ src/plugins/bearer/generic/qgenericengine.cpp 2018-12-23 12:42:48.095145000 +0100 +@@ -82,7 +82,7 @@ + // needed as interface is used as parameter name in qGetInterfaceType + #undef interface + +-#ifdef Q_OS_LINUX ++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) + #include <sys/socket.h> + #include <sys/ioctl.h> + #include <net/if.h> +@@ -139,6 +139,23 @@ + + if (result >= 0 && request.ifr_hwaddr.sa_family == ARPHRD_ETHER) + return QNetworkConfiguration::BearerEthernet; ++ ++#elif defined(Q_OS_FREEBSD) ++ int sock = socket(AF_LOCAL, SOCK_DGRAM, 0); ++ ++ ifreq request; ++ memset(&request, 0, sizeof(struct ifreq)); ++ strncpy(request.ifr_name, interface.toLocal8Bit().data(), sizeof(request.ifr_name) - 1); ++ request.ifr_name[sizeof(request.ifr_name) - 1] = '\0'; ++ ++ if (sock >= 0) { ++ int result = ioctl(sock, SIOCGHWADDR, &request); ++ close(sock); ++ ++ if (result >= 0) ++ return QNetworkConfiguration::BearerEthernet; ++ } ++ + #elif defined(Q_OS_WINRT) + ComPtr<INetworkInformationStatics> networkInfoStatics; + HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &networkInfoStatics); |