On 2/9/11 10:30 AM, Blair Zajac wrote:
On 2/9/11 1:38 AM, John Szakmeister wrote:
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!

Thanks!

Who here can commit to apr?

Stefan Fritsch committed a looping solution in r1073142 (trunk), r1073145 (1.5.x), r1073146 (1.4.x).

Blair

Reply via email to