summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-03-11 13:50:56 -0800
committerThiago Macieira <thiago.macieira@intel.com>2021-03-18 19:53:56 -0800
commit8614491aa1a19973f2039c5c5f2e5551cc535b8c (patch)
tree3e07fe80161487b79a11e67d6dc6de1b54f1c383
parent180f78d12680f1954f9ea3f4b00200ecfa1a853e (diff)
QAbstractSocket: fake a bind(QHostAddress::SpecialAddress)
Because this is misleading: socket.bind(QHostAddress::AnyIPv4); The conversion of enum to int has preference over the construction of QHostAddress from enum, so that ends up calling bind(6), which attempts to bind to privileged port 6 and just returns with error. Meanwhile, socket.bind(QHostAddress::AnyIPv4, 0); does construct the QHostAddress because that is preferred to converting the int to the BindMode enum. Ideally we'd simply add the overload to QAbstractSocket but we can't do that because QHostAddress depends on QAbstractSocket. So I've added a Qt7 task to invert that dependency. Change-Id: I26b8286f61534f88b649fffd166b683266597796 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/network/kernel/qhostaddress.h2
-rw-r--r--src/network/socket/qabstractsocket.cpp15
-rw-r--r--src/network/socket/qabstractsocket.h8
-rw-r--r--src/network/socket/qtcpsocket.h8
-rw-r--r--src/network/socket/qudpsocket.h7
5 files changed, 40 insertions, 0 deletions
diff --git a/src/network/kernel/qhostaddress.h b/src/network/kernel/qhostaddress.h
index 2b61cbba14..4b1bdfced8 100644
--- a/src/network/kernel/qhostaddress.h
+++ b/src/network/kernel/qhostaddress.h
@@ -115,6 +115,8 @@ public:
bool setAddress(const QString &address);
void setAddress(SpecialAddress address);
+ // ### Qt7: consider moving NetworkLayerProtocol to QHostAddress so we
+ // don't depend on QAbstractSocket
QAbstractSocket::NetworkLayerProtocol protocol() const;
quint32 toIPv4Address(bool *ok = nullptr) const;
Q_IPV6ADDR toIPv6Address() const;
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 31847c0142..16819404f4 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -1604,6 +1604,19 @@ bool QAbstractSocketPrivate::bind(const QHostAddress &address, quint16 port, QAb
}
/*!
+ \fn bool QAbstractSocket::bind(QHostAddress::SpecialAddress addr, quint16 port, BindMode mode)
+ \since 6.2
+ \overload
+
+ Binds to the special address \a addr on port \a port, using the BindMode \a
+ mode.
+
+ By default, the socket is bound using the DefaultForPlatform BindMode.
+ If a port is not specified, a random port is chosen.
+*/
+
+/*!
+ \fn bool QAbstractSocket::bind(quint16 port, BindMode mode)
\since 5.0
\overload
@@ -1612,10 +1625,12 @@ bool QAbstractSocketPrivate::bind(const QHostAddress &address, quint16 port, QAb
By default, the socket is bound using the DefaultForPlatform BindMode.
If a port is not specified, a random port is chosen.
*/
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
bool QAbstractSocket::bind(quint16 port, BindMode mode)
{
return bind(QHostAddress::Any, port, mode);
}
+#endif
/*!
Returns \c true if the socket is valid and ready for use; otherwise
diff --git a/src/network/socket/qabstractsocket.h b/src/network/socket/qabstractsocket.h
index bf1ff7e9a2..5874ddb8e8 100644
--- a/src/network/socket/qabstractsocket.h
+++ b/src/network/socket/qabstractsocket.h
@@ -148,7 +148,15 @@ public:
virtual bool bind(const QHostAddress &address, quint16 port = 0,
BindMode mode = DefaultForPlatform);
+#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(Q_CLANG_QDOC)
+ // ### Qt7: this requires that QHostAddress stop depending on QAbstractSocket::NetworkLayerProtocol
+ bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, BindMode mode = DefaultForPlatform)
+ { return bind(QHostAddress(addr), port, mode); }
+ bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
+ { retrurn bind(QHostAddress::Any, port, mode); }
+#else
bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform);
+#endif
virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
diff --git a/src/network/socket/qtcpsocket.h b/src/network/socket/qtcpsocket.h
index e52eddfdbd..b0b296654c 100644
--- a/src/network/socket/qtcpsocket.h
+++ b/src/network/socket/qtcpsocket.h
@@ -42,6 +42,7 @@
#include <QtNetwork/qtnetworkglobal.h>
#include <QtNetwork/qabstractsocket.h>
+#include <QtNetwork/qhostaddress.h>
#include <QtCore/qvariant.h>
QT_BEGIN_NAMESPACE
@@ -56,6 +57,13 @@ public:
explicit QTcpSocket(QObject *parent = nullptr);
virtual ~QTcpSocket();
+#if QT_VERSION < QT_VERSION_CHECK(7,0,0) && !defined(Q_CLANG_QDOC)
+ // ### Qt7: move into QAbstractSocket
+ using QAbstractSocket::bind;
+ bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, BindMode mode = DefaultForPlatform)
+ { return bind(QHostAddress(addr), port, mode); }
+#endif
+
protected:
QTcpSocket(QTcpSocketPrivate &dd, QObject *parent = nullptr);
QTcpSocket(QAbstractSocket::SocketType socketType, QTcpSocketPrivate &dd,
diff --git a/src/network/socket/qudpsocket.h b/src/network/socket/qudpsocket.h
index e2ddba1362..d68a3d16aa 100644
--- a/src/network/socket/qudpsocket.h
+++ b/src/network/socket/qudpsocket.h
@@ -60,6 +60,13 @@ public:
explicit QUdpSocket(QObject *parent = nullptr);
virtual ~QUdpSocket();
+#if QT_VERSION < QT_VERSION_CHECK(7,0,0) && !defined(Q_CLANG_QDOC)
+ // ### Qt7: move into QAbstractSocket
+ using QAbstractSocket::bind;
+ bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, BindMode mode = DefaultForPlatform)
+ { return bind(QHostAddress(addr), port, mode); }
+#endif
+
#ifndef QT_NO_NETWORKINTERFACE
bool joinMulticastGroup(const QHostAddress &groupAddress);
bool joinMulticastGroup(const QHostAddress &groupAddress,