On Mon, 2013-01-28 at 14:59 +0100, Pavel Raiskup wrote:
> On Mon, 2013-01-28 at 10:17 +0100, Pavel Raiskup wrote:
> > Hi Paul,
> >
> > > Thanks for catching that bug. We don't yet have a facility
> > > for large test cases, so I guess we can put that on the todo list.
> >
> > I agree (this is probably about paxutils?).
> >
> > > Your patch doesn't feel quite right, as there's a similar
> > > issue in pax_dump_header_0, and also there's a problem if
> > > the shrunken size is less than 8 GiB but the real size is not.
> > > I pushed the following patch instead: does it fix things for you?
> >
> > Of course, it fixes the issue. Thanks for this!
>
> Another small problem: tar is unable to list such archive (containing
> sparse file(s) of size >8GB). It does not honor the size=N extended
> header during reading. This is because the file_stat->archive_file_size
> is set based on basic header field only before xheader_decode() is
> executed.
>
> Could you consider/use as inspiration the following fix? Thanks.
Re-sending patch with added comments (attached).
Pavel
diff --git a/src/xheader.c b/src/xheader.c
index c8c54b6..ff5c9c3 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -1305,7 +1305,17 @@ size_decoder (struct tar_stat_info *st,
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
- st->stat.st_size = u;
+ {
+ if (u > st->stat.st_size)
+ /* Do *not* overwrite stat.st_size when it has been set by
+ GNU.sparse.realsize (func sparse_size_decoder) already. */
+ st->stat.st_size = u;
+
+ /* Inherit the effective size from extended header. This is needed
+ especially for sparse files - they coul'd have zero value otherwise
+ inherited from default (non-extended) header field */
+ st->archive_file_size = u;
+ }
}
static void