diff options
author | Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> | 2016-06-09 10:36:50 +0200 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@theqtcompany.com> | 2016-06-14 07:29:01 +0000 |
commit | 23173c725ce8b1c5b03498c9fa2bb334d40ec6f4 (patch) | |
tree | 3612dbad5d56b186d63d6f7c2786e06ecf9c588b /tests/auto | |
parent | e969e6d2ca5636b87b3de963ebd8dac993275617 (diff) |
QSslSocket (OpenSSL) - handle abort/close on sslErrors emitted
If a user's code, attached to sslErrors signal, calls abort/close
or disconnectFromHost but our SSL socket was configured not to verify a peer,
no need to continue handshake after calling checkSslErrors
(and finally crashing on invalid 'ssl' pointer).
Task-number: QTBUG-53906
Change-Id: I7f185511d278f9d6f16e7d6c5ba424707141459c
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp index 257df13343..7846dc99c5 100644 --- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -212,6 +212,7 @@ private slots: void ignoreSslErrorsList(); void ignoreSslErrorsListWithSlot_data(); void ignoreSslErrorsListWithSlot(); + void abortOnSslErrors(); void readFromClosedSocket(); void writeBigChunk(); void blacklistedCertificates(); @@ -250,6 +251,11 @@ protected slots: { socket->ignoreSslErrors(); } + void abortOnErrorSlot() + { + QSslSocket *sock = static_cast<QSslSocket *>(sender()); + sock->abort(); + } void untrustedWorkaroundSlot(const QList<QSslError> &errors) { if (errors.size() == 1 && @@ -2311,6 +2317,27 @@ void tst_QSslSocket::ignoreSslErrorsListWithSlot() QSKIP("Skipping flaky test - See QTBUG-29941"); } +void tst_QSslSocket::abortOnSslErrors() +{ + QFETCH_GLOBAL(bool, setProxy); + if (setProxy) + return; + + SslServer server; + QVERIFY(server.listen()); + + QSslSocket clientSocket; + connect(&clientSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(abortOnErrorSlot())); + clientSocket.connectToHostEncrypted("127.0.0.1", server.serverPort()); + clientSocket.ignoreSslErrors(); + + QEventLoop loop; + QTimer::singleShot(1000, &loop, SLOT(quit())); + loop.exec(); + + QCOMPARE(clientSocket.state(), QAbstractSocket::UnconnectedState); +} + // make sure a closed socket has no bytesAvailable() // related to https://bugs.webkit.org/show_bug.cgi?id=28016 void tst_QSslSocket::readFromClosedSocket() |