summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorScott Deboy <sdeboy@secondstryke.com>2013-07-25 10:22:01 -0700
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-17 23:13:05 +0200
commitaf61b7312e2701bc89bdb78d6a8d8984c59c673f (patch)
treeedca43d38dbb93fb8eb166bb6fa98e04a7e103ce /src
parent898b8d05c51400f9e1c8c9c74f631322c351d3b4 (diff)
Resolve error caused by server-initiated TLS renegotiation
Updating the SSL_write code to correctly handle SSL_ERROR_WANT_WRITE and SSL_ERROR_WANT_READ, which are not actual errors. Change-Id: Icd7369b438ef402bf438c3fcc64514a1f9f45452 Reviewed-by: Peter Hartmann <phartmann@blackberry.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src')
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index e94df10fed..69b9e53884 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -796,11 +796,22 @@ void QSslSocketBackendPrivate::transmit()
while ((nextDataBlockSize = writeBuffer.nextDataBlockSize()) > 0) {
int writtenBytes = q_SSL_write(ssl, writeBuffer.readPointer(), nextDataBlockSize);
if (writtenBytes <= 0) {
- // ### Better error handling.
- q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(getErrorsFromOpenSsl()));
- q->setSocketError(QAbstractSocket::SslInternalError);
- emit q->error(QAbstractSocket::SslInternalError);
- return;
+ int error = q_SSL_get_error(ssl, writtenBytes);
+ //write can result in a want_write_error - not an error - continue transmitting
+ if (error == SSL_ERROR_WANT_WRITE) {
+ transmitting = true;
+ break;
+ } else if (error == SSL_ERROR_WANT_READ) {
+ //write can result in a want_read error, possibly due to renegotiation - not an error - stop transmitting
+ transmitting = false;
+ break;
+ } else {
+ // ### Better error handling.
+ q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(getErrorsFromOpenSsl()));
+ q->setSocketError(QAbstractSocket::SslInternalError);
+ emit q->error(QAbstractSocket::SslInternalError);
+ return;
+ }
}
#ifdef QSSLSOCKET_DEBUG
qDebug() << "QSslSocketBackendPrivate::transmit: encrypted" << writtenBytes << "bytes";