From c0097d1521383ce49956c9f4da8be01ad178f43e Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Fri, 31 Jul 2020 19:33:41 +0300 Subject: Remove QSslSocket::abort() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QAbstractSocket::abort() is not a virtual function and QSslSocket::abort() does not override it. Having two alternatives requires a dynamic typecasting and violates the principles of object- oriented programming. Due to the BC, we were unable to fix that in Qt5. Now, we can modify QSslSocket::close() to handle QAbstractSocket::abort() requests and remove the duplicate. Change-Id: I49d6f32a571ae6e35b08cb366816f917e580dae8 Reviewed-by: Oswald Buddenhagen Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Timur Pocheptsov --- src/network/socket/qabstractsocket.cpp | 11 ---------- src/network/ssl/qsslsocket.cpp | 38 ++++++++++------------------------ src/network/ssl/qsslsocket.h | 1 - 3 files changed, 11 insertions(+), 39 deletions(-) diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 21f1f742f7..cf6a7672fb 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -479,10 +479,6 @@ #include #include -#ifndef QT_NO_SSL -#include -#endif - #include #ifdef QABSTRACTSOCKET_DEBUG @@ -2406,13 +2402,6 @@ void QAbstractSocket::abort() qDebug("QAbstractSocket::abort()"); #endif d->setWriteChannelCount(0); -#ifndef QT_NO_SSL - if (QSslSocket *socket = qobject_cast(this)) { - socket->abort(); - return; - } -#endif - d->abortCalled = true; close(); } diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 19ab903d36..9d8fa035e2 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -899,13 +899,19 @@ void QSslSocket::close() #endif Q_D(QSslSocket); - // We don't want any CA roots fetched anymore. + // On Windows, CertGetCertificateChain is probably still doing its + // job, if the socket is re-used, we want to ignore its reported + // root CA. d->caToFetch = QSslCertificate{}; - if (encryptedBytesToWrite() || !d->writeBuffer.isEmpty()) + if (!d->abortCalled && (encryptedBytesToWrite() || !d->writeBuffer.isEmpty())) flush(); - if (d->plainSocket) - d->plainSocket->close(); + if (d->plainSocket) { + if (d->abortCalled) + d->plainSocket->abort(); + else + d->plainSocket->close(); + } QTcpSocket::close(); // must be cleared, reading/writing not possible on closed socket: @@ -938,29 +944,6 @@ void QSslSocket::setReadBufferSize(qint64 size) d->plainSocket->setReadBufferSize(size); } -/*! - Aborts the current connection and resets the socket. Unlike - disconnectFromHost(), this function immediately closes the socket, - clearing any pending data in the write buffer. - - \sa disconnectFromHost(), close() -*/ -void QSslSocket::abort() -{ - Q_D(QSslSocket); -#ifdef QSSLSOCKET_DEBUG - qCDebug(lcSsl) << "QSslSocket::abort()"; -#endif - // On Windows, CertGetCertificateChain is probably still doing its - // job, if the socket is re-used, we want to ignore its reported - // root CA. - d->caToFetch = QSslCertificate{}; - - if (d->plainSocket) - d->plainSocket->abort(); - close(); -} - /*! \since 4.4 @@ -1883,6 +1866,7 @@ void QSslSocketPrivate::init() connectionEncrypted = false; ignoreAllSslErrors = false; shutdown = false; + abortCalled = false; pendingClose = false; flushTriggered = false; ocspResponses.clear(); diff --git a/src/network/ssl/qsslsocket.h b/src/network/ssl/qsslsocket.h index 4a576b1784..a808efbfdf 100644 --- a/src/network/ssl/qsslsocket.h +++ b/src/network/ssl/qsslsocket.h @@ -117,7 +117,6 @@ public: bool canReadLine() const override; void close() override; bool atEnd() const override; - void abort(); // From QAbstractSocket: void setReadBufferSize(qint64 size) override; -- cgit v1.2.3