Fix crash when CONNECT method is used

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 <marten.nordheim@qt.io>
This commit is contained in:
Tasuku Suzuki 2020-02-12 17:06:32 +09:00
parent bf9bb2acb6
commit 4b87afbbe6
2 changed files with 20 additions and 1 deletions

View File

@ -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;
}

View File

@ -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)