diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2015-08-09 22:25:41 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2015-12-05 00:10:37 +0000 |
commit | 2fb42eb4af3444b11e7b1210323637937ef0b005 (patch) | |
tree | 9318aea61d70628e5e8be4be9fb1d5a0d7773a02 /src/network/socket/qnativesocketengine_p.h | |
parent | 4242fe0a039f271b98f7a2b6125ba76a45783ad1 (diff) | |
download | qtbase-2fb42eb4af3444b11e7b1210323637937ef0b005.tar.gz |
Properly set (sa|sin|sin6)_len on Unix systems that need it
Change-Id: I7de033f80b0e4431b7f1ffff13f90288a50606e7
Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/network/socket/qnativesocketengine_p.h')
-rw-r--r-- | src/network/socket/qnativesocketengine_p.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h index 39e4d5e457..2dc4bbaced 100644 --- a/src/network/socket/qnativesocketengine_p.h +++ b/src/network/socket/qnativesocketengine_p.h @@ -99,6 +99,16 @@ union qt_sockaddr { sockaddr_in6 a6; }; +namespace { +namespace SetSALen { + template <typename T> void set(T *sa, typename QtPrivate::QEnableIf<(&T::sa_len, true), QT_SOCKLEN_T>::Type len) + { sa->sa_len = len; } + template <typename T> void set(T *sin6, typename QtPrivate::QEnableIf<(&T::sin6_len, true), QT_SOCKLEN_T>::Type len) + { sin6->sin6_len = len; } + template <typename T> void set(T *, ...) {} +} +} + class QNativeSocketEnginePrivate; #ifndef QT_NO_NETWORKINTERFACE class QNetworkInterface; @@ -287,12 +297,14 @@ public: Q_IPV6ADDR tmp = address.toIPv6Address(); memcpy(&aa->a6.sin6_addr, &tmp, sizeof(tmp)); *sockAddrSize = sizeof(sockaddr_in6); + SetSALen::set(&aa->a, sizeof(sockaddr_in6)); } else { memset(&aa->a, 0, sizeof(sockaddr_in)); aa->a4.sin_family = AF_INET; aa->a4.sin_port = htons(port); aa->a4.sin_addr.s_addr = htonl(address.toIPv4Address()); *sockAddrSize = sizeof(sockaddr_in); + SetSALen::set(&aa->a, sizeof(sockaddr_in)); } } |