Boost logo

Boost :

From: Beman Dawes (bdawes_at_[hidden])
Date: 2006-02-07 18:12:42


G. Wade Johnson wrote:
> I was looking in the code for copy_file() and noticed what may be a bug. In
> the loop that handles partial writes, the code makes multiple attempts
> reducing the amount of data written each time. Unfortunately, the offset into
> the data is not changed as well. See below.
>
> sz_write = 0;
> do
> {
> if ( (sz = ::write( outfile, buf.get(), sz_read - sz_write )) < 0 )
> {
> sz_read = sz; // cause read loop termination
> break; // and error to be thrown after closes
> }
> sz_write += sz;
> } while ( sz_write < sz_read );
>
> Unless I'm missing something, it looks like a partial write will result in the
> first part of the buffer being written multiple times. I checked the version
> in CVS and it appears to have the same code.
>
> Am I missing something or is this incorrect?

A bug for sure. Nice catch. Fixed in CVS.

At least I hope it is fixed. I don't see an easy way to test it.

The code now reads:

           sz_write = 0;
           do
           {
             if ( (sz = ::write( outfile, buf.get()+sz_write,
               sz_read - sz_write )) < 0 )
             {
               sz_read = sz; // cause read loop termination
               break; // and error to be thrown after closes
             }
             sz_write += sz;
           } while ( sz_write < sz_read );

Thanks,

--Beman


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk