diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-08-07 03:00:18 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-08-07 03:00:18 +0200 |
commit | edf368405a26cb4c68913abb77a2a3614e79b4f8 (patch) | |
tree | b793317458bc0c307fdeb892380937e41139c042 /src/websockets | |
parent | b8c8bb67342b83091a4066ba6f45e150330cb0ac (diff) | |
parent | cf41cd16a1f156d68f9cb4a84dd77230f29d739f (diff) | |
download | qtwebsockets-edf368405a26cb4c68913abb77a2a3614e79b4f8.tar.gz |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: Iffe66da51d3b7b38d04ca3c185b3b003b157f886
Diffstat (limited to 'src/websockets')
-rw-r--r-- | src/websockets/qwebsocket.cpp | 5 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 10 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp index 64d5e4c..b9c6cc0 100644 --- a/src/websockets/qwebsocket.cpp +++ b/src/websockets/qwebsocket.cpp @@ -402,7 +402,10 @@ qint64 QWebSocket::sendBinaryMessage(const QByteArray &data) Any data in the write buffer is flushed before the socket is closed. The \a closeCode is a QWebSocketProtocol::CloseCode indicating the reason to close, and - \a reason describes the reason of the closure more in detail + \a reason describes the reason of the closure more in detail. All control + frames, including the Close frame, are limited to 125 bytes. Since two of + these are used for \a closeCode the maximum length of \a reason is 123! If + \a reason exceeds this limit it will be truncated. */ void QWebSocket::close(QWebSocketProtocol::CloseCode closeCode, const QString &reason) { diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 45d6a6f..9b27ad2 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -334,12 +334,14 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r if (!m_isClosingHandshakeSent) { Q_Q(QWebSocket); m_closeCode = closeCode; - m_closeReason = reason; + // 125 is the maximum length of a control frame, and 2 bytes are used for the close code: + const QByteArray reasonUtf8 = reason.toUtf8().left(123); + m_closeReason = QString::fromUtf8(reasonUtf8); const quint16 code = qToBigEndian<quint16>(closeCode); QByteArray payload; payload.append(static_cast<const char *>(static_cast<const void *>(&code)), 2); - if (!reason.isEmpty()) - payload.append(reason.toUtf8()); + if (!reasonUtf8.isEmpty()) + payload.append(reasonUtf8); quint32 maskingKey = 0; if (m_mustMask) { maskingKey = generateMaskingKey(); @@ -347,6 +349,8 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r } QByteArray frame = getFrameHeader(QWebSocketProtocol::OpCodeClose, payload.size(), maskingKey, true); + + Q_ASSERT(payload.length() <= 125); frame.append(payload); m_pSocket->write(frame); m_pSocket->flush(); |