[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: apr_file_flush and short writes

From: John Szakmeister <john_at_szakmeister.net>
Date: Wed, 9 Feb 2011 04:38:41 -0500

On Mon, Feb 7, 2011 at 4:26 PM, Blair Zajac <blair_at_orcaware.com> wrote:
> [I sent this to dev_at_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-80B26906AE51@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
Received on 2011-02-09 10:39:19 CET

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.