summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorTimur Pocheptsov <Timur.Pocheptsov@digia.com>2015-04-01 12:23:21 +0200
committerTimur Pocheptsov <Timur.Pocheptsov@digia.com>2015-04-01 15:36:45 +0000
commita72b3ab73c31f3316f8f2b0f2e17edd41a459481 (patch)
treee2856dc1fedd0798214cd4c884149324d711678a /src/network
parent2432a821aa272e567ae20e04ef8588112c4400dc (diff)
QSSLSocketPrivateBackend::transmit - fix Secure Transport version
New SSL backend fails to read data most of the time. This patch: 1. Removes direct call to _q_SSLRead - it was never executed (intentionally) and is completely horrible and redundant. 2. Changes the reading loop - read not while we have bytesAvailable, but until we have errSSLWouldBlock. Change-Id: I3fc5ff94ded76fcc1748d4979f7af85740b4b6aa Task-number: QTBUG-45290 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Jeremy Lainé <jeremy.laine@m4x.org> Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/ssl/qsslsocket_mac.cpp26
1 files changed, 9 insertions, 17 deletions
diff --git a/src/network/ssl/qsslsocket_mac.cpp b/src/network/ssl/qsslsocket_mac.cpp
index e833bb70c5..497cbf4c9b 100644
--- a/src/network/ssl/qsslsocket_mac.cpp
+++ b/src/network/ssl/qsslsocket_mac.cpp
@@ -383,25 +383,14 @@ void QSslSocketBackendPrivate::transmit()
if (connectionEncrypted) {
QVarLengthArray<char, 4096> data;
- while (plainSocket->bytesAvailable() > 0) {
+ while (true) {
size_t readBytes = 0;
data.resize(4096);
- if (shutdown) {
- // SSLRead(context, data.data(), data.size(), &readBytes) fails with errSSLClosedGraceful
- // if the session was closed (see disconnectFromHost).
- // SSLClose SSLRead fails and we'll stay in this loop forever.
- // At the moment we're never here (see the test '!context || shutdown' above) -
- // we read nothing from the socket as soon as SSL session closed.
- qCritical() << Q_FUNC_INFO << "read attempt after SSL session closed";
- size_t nBytes = plainSocket->bytesAvailable();
- _q_SSLRead(plainSocket, data.data(), &nBytes);
- } else {
- const OSStatus err = SSLRead(context, data.data(), data.size(), &readBytes);
- if (err != noErr && err != errSSLWouldBlock) {
- qWarning() << Q_FUNC_INFO << "SSLRead failed with:" << int(err);
- setError("SSL read failed", QAbstractSocket::SslInternalError);
- break;
- }
+ const OSStatus err = SSLRead(context, data.data(), data.size(), &readBytes);
+ if (err != noErr && err != errSSLWouldBlock) {
+ qWarning() << Q_FUNC_INFO << "SSLRead failed with:" << int(err);
+ setError("SSL read failed", QAbstractSocket::SslInternalError);
+ break;
}
if (readBytes) {
@@ -411,6 +400,9 @@ void QSslSocketBackendPrivate::transmit()
*readyReadEmittedPointer = true;
emit q->readyRead();
}
+
+ if (err == errSSLWouldBlock)
+ break;
}
}
}