diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2010-02-01 06:10:49 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2010-02-01 06:10:49 (GMT) |
commit | 1b4bb02fcb3da77ddfa6281365ba3210aab9daad (patch) | |
tree | ecaab6c64758f41fa9cb5b376b395831a77e6c83 /src/network/ssl | |
parent | ac6bd40b501c63941a4dfc4c1ba500b0c14f74de (diff) | |
parent | dc1cab966938edc5463f26189607ece134549a22 (diff) | |
download | Qt-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')
-rw-r--r-- | src/network/ssl/qsslcertificate.cpp | 8 | ||||
-rw-r--r-- | src/network/ssl/qsslsocket_openssl.cpp | 26 |
2 files changed, 27 insertions, 7 deletions
diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index 8993e72..9a9b1b5 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -696,11 +696,11 @@ QSslCertificate QSslCertificatePrivate::QSslCertificate_from_X509(X509 *x509) static bool matchLineFeed(const QByteArray &pem, int *offset) { - char ch = pem.at(*offset); + char ch; // ignore extra whitespace at the end of the line - while (ch == ' ' && *offset < pem.size()) - ch = pem.at(++*offset); + while (*offset < pem.size() && (ch = pem.at(*offset)) == ' ') + ++*offset; if (ch == '\n') { *offset += 1; @@ -732,7 +732,7 @@ QList<QSslCertificate> QSslCertificatePrivate::certificatesFromPem(const QByteAr break; offset = endPos + sizeof(ENDCERTSTRING) - 1; - if (!matchLineFeed(pem, &offset)) + if (offset < pem.size() && !matchLineFeed(pem, &offset)) break; QByteArray decoded = QByteArray::fromBase64( 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; } |