diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2016-01-20 14:03:24 +0200 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-01-26 14:44:46 +0000 |
commit | 371376409909e37b192ad4691c18d5e3b2e0bca4 (patch) | |
tree | 1bb89c2e5a087954122262a58057ca9228f1233b /src/network/socket/qabstractsocket.cpp | |
parent | 1272bd4d4a43ba495e2b89835597d2fc93249c4e (diff) |
QAbstractSocket: do not use internal buffer for discarding the data
Instead, allocate a temporary buffer on the stack. This prevents the
internal read buffer from being allocated if the device is opened only
for writing.
Change-Id: Ib91c58299206e92006589807527e7b71a5555c8f
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
Diffstat (limited to 'src/network/socket/qabstractsocket.cpp')
-rw-r--r-- | src/network/socket/qabstractsocket.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 24b6746d23..ccc6e91147 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -468,6 +468,7 @@ #include <qtimer.h> #include <qelapsedtimer.h> #include <qscopedvaluerollback.h> +#include <qvarlengtharray.h> #ifndef QT_NO_SSL #include <QtNetwork/qsslsocket.h> @@ -1234,27 +1235,39 @@ bool QAbstractSocketPrivate::readFromSocket() // host has _not_ disappeared). bytesToRead = 4096; } - if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - buffer.size())) - bytesToRead = readBufferMaxSize - buffer.size(); + + if (q->isReadable()) { + if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - buffer.size())) + bytesToRead = readBufferMaxSize - buffer.size(); #if defined(QABSTRACTSOCKET_DEBUG) - qDebug("QAbstractSocketPrivate::readFromSocket() about to read %lld bytes", - bytesToRead); + qDebug("QAbstractSocketPrivate::readFromSocket() about to read %lld bytes", + bytesToRead); #endif - // Read from the socket, store data in the read buffer. - char *ptr = buffer.reserve(bytesToRead); - qint64 readBytes = socketEngine->read(ptr, bytesToRead); - if (readBytes == -2) { - // No bytes currently available for reading. - buffer.chop(bytesToRead); - return true; - } - buffer.chop(bytesToRead - ((readBytes < 0 || !q->isReadable()) ? qint64(0) : readBytes)); + // Read from the socket, store data in the read buffer. + char *ptr = buffer.reserve(bytesToRead); + qint64 readBytes = socketEngine->read(ptr, bytesToRead); + if (readBytes == -2) { + // No bytes currently available for reading. + buffer.chop(bytesToRead); + return true; + } + buffer.chop(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes)); #if defined(QABSTRACTSOCKET_DEBUG) - qDebug("QAbstractSocketPrivate::readFromSocket() got %lld bytes, buffer size = %lld", - readBytes, buffer.size()); + qDebug("QAbstractSocketPrivate::readFromSocket() got %lld bytes, buffer size = %lld", + readBytes, buffer.size()); #endif + } else { + // Discard unwanted data if opened in WriteOnly mode + QVarLengthArray<char, 4096> discardBuffer(bytesToRead); + +#if defined(QABSTRACTSOCKET_DEBUG) + qDebug("QAbstractSocketPrivate::readFromSocket() about to discard %lld bytes", + bytesToRead); +#endif + socketEngine->read(discardBuffer.data(), bytesToRead); + } if (!socketEngine->isValid()) { setErrorAndEmit(socketEngine->error(), socketEngine->errorString()); |