CVS commit by mutz: From KDE_3_3_BRANCH: CCBUG:76314 Patch as posted here, plus a limitation of the receive buffer to 64K M +32 -15 sieve.cpp 1.12.4.2 --- kdepim/kioslaves/sieve/sieve.cpp #1.12.4.1:1.12.4.2 @@ -36,4 +36,5 @@ #include #include +#include #include @@ -625,23 +626,39 @@ void kio_sieveProtocol::get(const KURL& if (receiveData() && r.getType() == kio_sieveResponse::QUANTITY) { // determine script size - ssize_t bufLen = r.getQuantity(); - totalSize( bufLen ); + ssize_t total_len = r.getQuantity(); + totalSize( total_len ); - QByteArray dat( bufLen ); - ssize_t readLen = read( dat.data(), dat.size() ); + int recv_len = 0; + do { + // wait for data... + if ( !waitForResponse( 600 ) ) { + error( KIO::ERR_SERVER_TIMEOUT, m_sServer ); + disconnect( true ); + return; + } - if (readLen != bufLen) { - error(ERR_COULD_NOT_READ, i18n("Network error.")); - disconnect(true); + // ...read data... + // Only read as much as we need, otherwise we slurp in the OK that + // operationSuccessful() is expecting below. + QByteArray dat( kMin( total_len - recv_len, 64 * 1024 ) ); + ssize_t this_recv_len = read( dat.data(), dat.size() ); + + if ( this_recv_len < 1 && !isConnectionValid() ) { + error( KIO::ERR_CONNECTION_BROKEN, m_sServer ); + disconnect( true ); return; } + dat.resize( this_recv_len ); inplace_crlf2lf( dat ); // send data to slaveinterface - data(dat); - processedSize(readLen); - data(QByteArray()); + data( dat ); + + recv_len += this_recv_len; + processedSize( recv_len ); + } while ( recv_len < total_len ); infoMessage(i18n("Finishing up...") ); + data(QByteArray()); if (operationSuccessful())