From 8566487286439e65f217c0e80733d40ea9b19ac8 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Wed, 26 Jul 2017 13:39:11 +0300 Subject: QSslSocketBackendPrivate::transmit(): improve reading from OpenSSL This patch avoids intermediate copying of the data by writing SSL decryption data directly into the outer socket's read buffer. Change-Id: I19e5b6087595f280436a99fb2ca93cc6793c8f36 Reviewed-by: Edward Welbourne Reviewed-by: Oswald Buddenhagen Reviewed-by: Markus Goetz (Woboq GmbH) --- src/network/ssl/qsslsocket_openssl.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/network/ssl') diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 02bd4389af..650d37fdbb 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -756,15 +756,15 @@ void QSslSocketBackendPrivate::transmit() // we have a readBufferMaxSize. There's no point in leaving data there // just so that readBuffer.size() == readBufferMaxSize. int readBytes = 0; - data.resize(4096); - ::memset(data.data(), 0, data.size()); + const int bytesToRead = 4096; do { // Don't use SSL_pending(). It's very unreliable. - if ((readBytes = q_SSL_read(ssl, data.data(), data.size())) > 0) { + readBytes = q_SSL_read(ssl, buffer.reserve(bytesToRead), bytesToRead); + if (readBytes > 0) { #ifdef QSSLSOCKET_DEBUG qCDebug(lcSsl) << "QSslSocketBackendPrivate::transmit: decrypted" << readBytes << "bytes"; #endif - buffer.append(data.constData(), readBytes); + buffer.chop(bytesToRead - readBytes); if (readyReadEmittedPointer) *readyReadEmittedPointer = true; @@ -773,6 +773,7 @@ void QSslSocketBackendPrivate::transmit() transmitting = true; continue; } + buffer.chop(bytesToRead); // Error. switch (q_SSL_get_error(ssl, readBytes)) { -- cgit v1.2.3