diff options
author | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2017-10-13 13:25:33 +0200 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2017-10-13 18:13:03 +0000 |
commit | 7809bba68f65ad9e95691d52e6584314d4909bd0 (patch) | |
tree | 2826b0b18d12cd05f348dd0822dd72b9097af943 | |
parent | 5fa64386336b3072a12054726483e4850fc53dea (diff) |
QHostAddress::setAddress - fix an overload taking SpecialAddress
It must detach, otherwise it overwrites all QHostAddresses that were
sharing a given QHostAddressPrivate. This overload was introduced in
5.8 and probably as a result broke some pre-existing code, that previously
was using a conversion and the correctly working setAddress.
Conveniently, QHostAddress::clear() does: d.detach(); d->clear();,
exactly the first thing we do in other overloads of setAddress.
Task-number: QTBUG-63764
Change-Id: I63c36e877c9358d3ff26ba1f2e4adf35b771f426
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/network/kernel/qhostaddress.cpp | 86 |
1 files changed, 43 insertions, 43 deletions
diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp index 1b7061d050..a8d3a0bf98 100644 --- a/src/network/kernel/qhostaddress.cpp +++ b/src/network/kernel/qhostaddress.cpp @@ -519,49 +519,6 @@ QHostAddress::QHostAddress(SpecialAddress address) } /*! - \overload - \since 5.8 - - Sets the special address specified by \a address. -*/ -void QHostAddress::setAddress(SpecialAddress address) -{ - d->clear(); - - Q_IPV6ADDR ip6; - memset(&ip6, 0, sizeof ip6); - quint32 ip4 = INADDR_ANY; - - switch (address) { - case Null: - return; - - case Broadcast: - ip4 = INADDR_BROADCAST; - break; - case LocalHost: - ip4 = INADDR_LOOPBACK; - break; - case AnyIPv4: - break; - - case LocalHostIPv6: - ip6[15] = 1; - Q_FALLTHROUGH(); - case AnyIPv6: - d->setAddress(ip6); - return; - - case Any: - d->protocol = QAbstractSocket::AnyIPProtocol; - return; - } - - // common IPv4 part - d->setAddress(ip4); -} - -/*! Destroys the host address object. */ QHostAddress::~QHostAddress() @@ -725,6 +682,49 @@ void QHostAddress::setAddress(const struct sockaddr *sockaddr) } /*! + \overload + \since 5.8 + + Sets the special address specified by \a address. +*/ +void QHostAddress::setAddress(SpecialAddress address) +{ + clear(); + + Q_IPV6ADDR ip6; + memset(&ip6, 0, sizeof ip6); + quint32 ip4 = INADDR_ANY; + + switch (address) { + case Null: + return; + + case Broadcast: + ip4 = INADDR_BROADCAST; + break; + case LocalHost: + ip4 = INADDR_LOOPBACK; + break; + case AnyIPv4: + break; + + case LocalHostIPv6: + ip6[15] = 1; + Q_FALLTHROUGH(); + case AnyIPv6: + d->setAddress(ip6); + return; + + case Any: + d->protocol = QAbstractSocket::AnyIPProtocol; + return; + } + + // common IPv4 part + d->setAddress(ip4); +} + +/*! Returns the IPv4 address as a number. For example, if the address is 127.0.0.1, the returned value is |