On Mon, Feb 7, 2011 at 4:26 PM, Blair Zajac <bl...@orcaware.com> wrote: > [I sent this to d...@apr.apache.org but haven't received a response. Thread > here: > http://mail-archives.apache.org/mod_mbox/apr-dev/201102.mbox/%3cf7b1928d-d32f-48dd-b8d9-80b26906a...@orcaware.com%3E > . Given the importance of writing complete files for svn, could somebody > take a look and see if this is a valid issue]. > > I was looking at apr_file_flush() and think I found a bug where if write() > doesn't do a full write, then the apr_file_t will destroy and buffered data > because it sets its internal buffer position back to 0.
Yeah, that looks like a bug. > Here's a patch for this: > > Index: file_io/unix/readwrite.c > =================================================================== > --- file_io/unix/readwrite.c (revision 1067340) > +++ file_io/unix/readwrite.c (working copy) > @@ -409,7 +409,11 @@ > rv = errno; > } else { > thefile->filePtr += written; > - thefile->bufpos = 0; > + if (written != thefile->bufpos) > + memmove(thefile->buffer, > + thefile->buffer + written, > + thefile->bufpos - written); > + thefile->bufpos -= written; > } > } > > Beyond this, there's no a mechanism to report that all the buffered data > didn't get into the file. Perhaps apr_file_flush() should loop until the > entire buffer is written or it gets a non-EINTR error? I think it you're right, it should loop around. Good catch! -John