From 5b469aa3c4d6b9c68feb9cf92d03614077518894 Mon Sep 17 00:00:00 2001 From: Kimmo Karvinen Date: Tue, 31 Mar 2015 17:14:33 +0300 Subject: Fixed a crash when destroying the QWebSocketServer Lifetime of incoming QTcpSocket/QSslSocket are managed by the QTcpServer/QSslServer and thus the QWebSocketPrivate should clear the pointer to the socket when the socket is destroyed. Added auto test for the crash. Task-number: QTBUG-45331 Change-Id: I6e30e7cdcca22aa810ccc1a1d4d7d77c7cb2c349 Reviewed-by: Steven Ceuppens Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 11 +++++++++++ src/websockets/qwebsocket_p.h | 2 ++ 2 files changed, 13 insertions(+) (limited to 'src') diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index ced197e..76a5882 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -542,6 +542,10 @@ void QWebSocketPrivate::makeConnections(const QTcpSocket *pTcpSocket) QObject::connect(pTcpSocket, &QAbstractSocket::aboutToClose, q, &QWebSocket::aboutToClose); QObject::connect(pTcpSocket, &QAbstractSocket::bytesWritten, q, &QWebSocket::bytesWritten); + + QObjectPrivate::connect(pTcpSocket, &QObject::destroyed, + this, &QWebSocketPrivate::socketDestroyed); + //catch signals QObjectPrivate::connect(pTcpSocket, &QAbstractSocket::stateChanged, this, &QWebSocketPrivate::processStateChanged); @@ -1048,6 +1052,13 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS } } +void QWebSocketPrivate::socketDestroyed(QObject *socket) +{ + Q_ASSERT(m_pSocket); + if (m_pSocket.data() == socket) + m_pSocket.take(); +} + /*! \internal */ diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index f13e08d..85d3f49 100644 --- a/src/websockets/qwebsocket_p.h +++ b/src/websockets/qwebsocket_p.h @@ -162,6 +162,8 @@ private: void setSocketState(QAbstractSocket::SocketState state); void setErrorString(const QString &errorString); + void socketDestroyed(QObject *socket); + void processData(); void processPing(const QByteArray &data); void processPong(const QByteArray &data); -- cgit v1.2.1 From 30b5e99da347aea446a5a3a334a21a4406adc4fe Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Mon, 9 Mar 2015 19:20:26 +0100 Subject: Always initialize m_handshakeState The client-side constructor was leaving it uninitialized, which would sometimes lead to spurious error signals being emitted. Task-number: QTBUG-44893 Change-Id: I7a17f1a16d9a5fe4218beb6d92993c1889ad836b Reviewed-by: Oswald Buddenhagen Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 2bb5151..8aa2fe1 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -105,7 +105,8 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol:: m_dataProcessor(), m_configuration(), m_pMaskGenerator(&m_defaultMaskGenerator), - m_defaultMaskGenerator() + m_defaultMaskGenerator(), + m_handshakeState(NothingDoneState) { } -- cgit v1.2.1 From 48418a2e16b6dede3bc002dda5a3cb277fd3e802 Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Mon, 9 Mar 2015 18:48:31 +0100 Subject: Do not decode the HTTP resource name The resource needs to be sent encoded in the HTTP request. Task-number: QTBUG-44889 Change-Id: I3c6c56f5fea1553f3b5751de7da0cfc76150f4b9 Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 8aa2fe1..3280377 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -353,8 +353,9 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask) m_isClosingHandshakeSent = false; setRequestUrl(url); - QString resourceName = url.path(); - if (resourceName.contains(QStringLiteral("\r\n"))) { + QString resourceName = url.path(QUrl::FullyEncoded); + // Check for encoded \r\n + if (resourceName.contains(QStringLiteral("%0D%0A"))) { setRequestUrl(QUrl()); //clear requestUrl setErrorString(QWebSocket::tr("Invalid resource name.")); Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); -- cgit v1.2.1 From 0fcfc33963a48dee74eb971decbf89f35c3240f0 Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Thu, 9 Apr 2015 11:37:02 +0200 Subject: Fix copy constructor Change-Id: I2c27bda6523ff84d9ea9178f1e6728bf4defc511 Reviewed-by: Oswald Buddenhagen Reviewed-by: Liang Qi --- src/websockets/qwebsocketframe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/websockets/qwebsocketframe.cpp b/src/websockets/qwebsocketframe.cpp index a4e644b..d533921 100644 --- a/src/websockets/qwebsocketframe.cpp +++ b/src/websockets/qwebsocketframe.cpp @@ -102,7 +102,7 @@ QWebSocketFrame &QWebSocketFrame::operator =(const QWebSocketFrame &other) m_mask = other.m_mask; m_rsv1 = other.m_rsv1; m_rsv2 = other.m_rsv2; - m_rsv3 = other.m_rsv2; + m_rsv3 = other.m_rsv3; m_opCode = other.m_opCode; m_length = other.m_length; m_payload = other.m_payload; -- cgit v1.2.1