[filesystem] Possible problem in copy_file

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? G. Wade

"G. Wade Johnson" <gwade@anomaly.org> wrote in message news:20060118204932.37feb318@sovvan...
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?
Thanks for the report. It will few more days before I can investigate. --Beman

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
participants (2)
-
Beman Dawes
-
G. Wade Johnson