From 4b87afbbe6132b03d114cce1cbb7958cf1f3bac8 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Wed, 12 Feb 2020 17:06:32 +0900 Subject: [PATCH] Fix crash when CONNECT method is used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the parser received "CONNECT / HTTP/1.1\n\n", its upgrade variable is set to 1 even though there is no "upgrade" header available. In this case, QMap::find() returns its end. Task-number: QTBUG-82053 Change-Id: I41cc23511459c6735a474bb7b903638dd4b1208f Reviewed-by: MÃ¥rten Nordheim --- src/httpserver/qabstracthttpserver.cpp | 2 +- .../tst_qabstracthttpserver.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/httpserver/qabstracthttpserver.cpp b/src/httpserver/qabstracthttpserver.cpp index 26e6e97..262ec9b 100644 --- a/src/httpserver/qabstracthttpserver.cpp +++ b/src/httpserver/qabstracthttpserver.cpp @@ -116,8 +116,8 @@ void QAbstractHttpServerPrivate::handleReadyRead(QTcpSocket *socket, return; } #endif + qCWarning(lcHttpServer, "Upgrade to %s not supported", it.value().second.constData()); } - qCWarning(lcHttpServer, "Upgrade to %s not supported", it.value().second.constData()); socket->disconnectFromHost(); return; } diff --git a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp index bdb40a8..070f532 100644 --- a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp +++ b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp @@ -62,6 +62,7 @@ private slots: void websocket(); void servers(); void fork(); + void qtbug82053(); }; void tst_QAbstractHttpServer::request_data() @@ -244,6 +245,24 @@ void tst_QAbstractHttpServer::fork() #endif } +void tst_QAbstractHttpServer::qtbug82053() +{ + struct HttpServer : QAbstractHttpServer + { + bool handleRequest(const QHttpServerRequest &, QTcpSocket *) override { return false; } + } server; + auto tcpServer = new QTcpServer; + tcpServer->listen(); + server.bind(tcpServer); + + auto client = new QTcpSocket; + client->connectToHost(QHostAddress::LocalHost, tcpServer->serverPort()); + client->waitForConnected(); + client->write("CONNECT / HTTP/1.1\n\n"); + client->waitForBytesWritten(); + QTest::qWait(0); +} + QT_END_NAMESPACE QTEST_MAIN(tst_QAbstractHttpServer)