summaryrefslogtreecommitdiffstats
path: root/src/network/ssl/qsslsocket_openssl.cpp
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-02-01 06:10:49 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-02-01 06:10:49 (GMT)
commit1b4bb02fcb3da77ddfa6281365ba3210aab9daad (patch)
treeecaab6c64758f41fa9cb5b376b395831a77e6c83 /src/network/ssl/qsslsocket_openssl.cpp
parentac6bd40b501c63941a4dfc4c1ba500b0c14f74de (diff)
parentdc1cab966938edc5463f26189607ece134549a22 (diff)
downloadQt-1b4bb02fcb3da77ddfa6281365ba3210aab9daad.zip
Qt-1b4bb02fcb3da77ddfa6281365ba3210aab9daad.tar.gz
Qt-1b4bb02fcb3da77ddfa6281365ba3210aab9daad.tar.bz2
Merge branch 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-1 into master-integration
* 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-1: (35 commits) Fix build due to missing auto-generated files on dbus example examples/dbus: update remotecontrolledcar example examples/dbus: update dbus-chat adaptor/interface files doc: Fix typo in QEvent::ignore() documentation doc: Fix qmake-manual warn_on/warn_off references Use X/Open LFS extensions for 64-bit support on directory iteration nano-optimizations code cleanup and styling fixes QDirPrivate: remove unused q_ptr and Q_DECLARE_PUBLIC QDir: clear internal file lists cache early QDirPrivate::setPath: always initialize the file engine optimize QDir::cd() QDirPrivate::Data: remove needless clear()-s in constructors QDir::cleanPath: strip trailing slash for "/:/" on non-win platforms QDir::entry(Info)List(): really use cached data Fix QDir::operator[] documentation Move avkon component transparency check to app initialization. Fix for symbian dialog background transparency. Assistant docs: Fix link. QtHelp docs: Fix illegal namespace name. ...
Diffstat (limited to 'src/network/ssl/qsslsocket_openssl.cpp')
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index de1583e..892d330 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -553,6 +553,12 @@ void QSslSocketBackendPrivate::transmit()
#endif
writeBuffer.free(writtenBytes);
totalBytesWritten += writtenBytes;
+
+ if (writtenBytes < nextDataBlockSize) {
+ // break out of the writing loop and try again after we had read
+ transmitting = true;
+ break;
+ }
}
if (totalBytesWritten > 0) {
@@ -586,12 +592,26 @@ void QSslSocketBackendPrivate::transmit()
while ((pendingBytes = plainSocket->bytesAvailable()) > 0) {
// Read encrypted data from the socket into a buffer.
data.resize(pendingBytes);
- int decryptedBytesRead = plainSocket->read(data.data(), pendingBytes);
+ // just peek() here because q_BIO_write could write less data than expected
+ int encryptedBytesRead = plainSocket->peek(data.data(), pendingBytes);
#ifdef QSSLSOCKET_DEBUG
- qDebug() << "QSslSocketBackendPrivate::transmit: read" << decryptedBytesRead << "encrypted bytes from the socket";
+ qDebug() << "QSslSocketBackendPrivate::transmit: read" << encryptedBytesRead << "encrypted bytes from the socket";
#endif
// Write encrypted data from the buffer into the read BIO.
- q_BIO_write(readBio, data.constData(), decryptedBytesRead);
+ int writtenToBio = q_BIO_write(readBio, data.constData(), encryptedBytesRead);
+
+ // do the actual read() here and throw away the results.
+ if (writtenToBio > 0) {
+ // ### TODO: make this cheaper by not making it memcpy. E.g. make it work with data=0x0 or make it work with seek
+ plainSocket->read(data.data(), writtenToBio);
+ } else {
+ // ### Better error handling.
+ q->setErrorString(QSslSocket::tr("Unable to decrypt data: %1").arg(SSL_ERRORSTR()));
+ q->setSocketError(QAbstractSocket::UnknownSocketError);
+ emit q->error(QAbstractSocket::UnknownSocketError);
+ return;
+ }
+
transmitting = true;
}