From cf41cd16a1f156d68f9cb4a84dd77230f29d739f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Thu, 2 Aug 2018 16:54:49 +0200 Subject: Limit Close frame to 125 bytes All control frames should be limited to 125 frames. https://tools.ietf.org/html/rfc6455#section-5.5 Task-number: QTBUG-62949 Change-Id: Id9b5a431faab6ff6edf7dc2e5c3525e999bc04ea Reviewed-by: Timur Pocheptsov Reviewed-by: Jesus Fernandez --- src/websockets/qwebsocket_p.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/websockets/qwebsocket_p.cpp') diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index f4ed311..d233b66 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(closeCode); QByteArray payload; payload.append(static_cast(static_cast(&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(); -- cgit v1.2.3