Prevent data loss when an ssl socket is closed by remote
SSL context was destroyed on disconnect. This makes it impossible to decrypt buffered encrypted data. So if there is encrypted data in the receive buffers, then don't destroy the ssl context until the socket is destroyed. Task-Number: QTBUG-23607 Change-Id: I16a7b4fa006647ec73049c90cdbc72686696850f Reviewed-by: Jonas Gastal <jgastal@profusion.mobi> Reviewed-by: Richard J. Moore <rich@kde.org>
This commit is contained in:
parent
755cd58f9c
commit
c5aba0ac17
@ -172,6 +172,7 @@ QSslSocketBackendPrivate::QSslSocketBackendPrivate()
|
||||
|
||||
QSslSocketBackendPrivate::~QSslSocketBackendPrivate()
|
||||
{
|
||||
destroySslContext();
|
||||
}
|
||||
|
||||
QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(SSL_CIPHER *cipher)
|
||||
@ -508,6 +509,22 @@ init_context:
|
||||
return true;
|
||||
}
|
||||
|
||||
void QSslSocketBackendPrivate::destroySslContext()
|
||||
{
|
||||
if (ssl) {
|
||||
q_SSL_free(ssl);
|
||||
ssl = 0;
|
||||
}
|
||||
if (ctx) {
|
||||
q_SSL_CTX_free(ctx);
|
||||
ctx = 0;
|
||||
}
|
||||
if (pkey) {
|
||||
q_EVP_PKEY_free(pkey);
|
||||
pkey = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
@ -1232,18 +1249,10 @@ void QSslSocketBackendPrivate::disconnectFromHost()
|
||||
|
||||
void QSslSocketBackendPrivate::disconnected()
|
||||
{
|
||||
if (ssl) {
|
||||
q_SSL_free(ssl);
|
||||
ssl = 0;
|
||||
}
|
||||
if (ctx) {
|
||||
q_SSL_CTX_free(ctx);
|
||||
ctx = 0;
|
||||
}
|
||||
if (pkey) {
|
||||
q_EVP_PKEY_free(pkey);
|
||||
pkey = 0;
|
||||
}
|
||||
if (plainSocket->bytesAvailable() <= 0)
|
||||
destroySslContext();
|
||||
//if there is still buffered data in the plain socket, don't destroy the ssl context yet.
|
||||
//it will be destroyed when the socket is deleted.
|
||||
}
|
||||
|
||||
QSslCipher QSslSocketBackendPrivate::sessionCipher() const
|
||||
|
@ -99,6 +99,7 @@ public:
|
||||
|
||||
// SSL context
|
||||
bool initSslContext();
|
||||
void destroySslContext();
|
||||
SSL *ssl;
|
||||
SSL_CTX *ctx;
|
||||
EVP_PKEY *pkey;
|
||||
|
Loading…
Reference in New Issue
Block a user