From kde-commits Sun Oct 24 17:10:38 2004 From: Marc Mutz Date: Sun, 24 Oct 2004 17:10:38 +0000 To: kde-commits Subject: kdepim/kioslaves/sieve Message-Id: <20041024171038.934099908 () office ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=109863785022368 CVS commit by mutz: From KDE_3_3_BRANCH: BUG:76314 Patch as posted here, plus a limitation of the receive buffer to 64K M +32 -15 sieve.cpp 1.15 --- kdepim/kioslaves/sieve/sieve.cpp #1.14:1.15 @@ -39,4 +39,5 @@ extern "C" { #include #include +#include #include @@ -647,23 +648,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())