Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 May 2010 00:24:35 +0400
From:      Anonymous <swell.k@gmail.com>
To:        Tim Kientzle <kientzle@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r207790 - head/usr.bin/tar
Message-ID:  <868w7bd6rg.fsf@gmail.com>
In-Reply-To: <4BF811C2.4050901@freebsd.org> (Tim Kientzle's message of "Sat, 22 May 2010 10:17:54 -0700")
References:  <201005081628.o48GSM9s067363__30886.3841965378$1273336146$gmane$org@svn.freebsd.org> <86aas3oc8b.fsf@gmail.com> <4BF059FF.8050002__30617.9139217877$1274042897$gmane$org@freebsd.org> <861vdaakkf.fsf@gmail.com> <86mxvsxtjh.fsf@gmail.com> <4BF811C2.4050901@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Tim Kientzle <kientzle@freebsd.org> writes:

> Ah, yes.  I did forget to add an EINTR check to the write side.
>
> Attached patch should fix "tar cf"
>
> Thanks for your careful testing...
>
[...]
> Index: archive_write.c
> ===================================================================
> --- archive_write.c	(revision 2413)
> +++ archive_write.c	(working copy)
> @@ -361,11 +361,20 @@
>                  remaining -= to_copy;
>                  /* ... if it's full, write it out. */
>                  if (state->avail == 0) {
> -                        bytes_written = (a->client_writer)(&a->archive,
> -                            a->client_data, state->buffer, state->buffer_size);
> -                        if (bytes_written <= 0)
> -                                return (ARCHIVE_FATAL);
> -                        /* XXX TODO: if bytes_written < state->buffer_size */
> +			char *p = state->buffer;
> +			size_t remaining = state->buffer_size;
> +			while (remaining > 0) {
> +				bytes_written = (a->client_writer)(&a->archive,
> +				    a->client_data, p, remaining);
> +				if (bytes_written <= 0)
> +					return (ARCHIVE_FATAL);
> +				if (bytes_remaining > remaining) {
> +					archive_set_error(a, -1, "write overrun");
> +					return (ARCHIVE_FATAL);
> +				}
> +				p += bytes_written;
> +				remaining -= bytes_written;
> +			}
>                          state->next = state->buffer;
>                          state->avail = state->buffer_size;
>                  }

This hunk doesn't apply against archive_write.c@r201099. It depends on
r1936 from googlecode that wasn't merged to /head.

I compiled without the above hunk and I no longer able to reproduce the
issue. Thanks.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?868w7bd6rg.fsf>