X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fxheader.c;h=361f684751806c5482d44f9c1fa1ed1f397c6ac7;hb=ec94fbdf458adb2af803eefdd1a9c9bbb432bb21;hp=c8c54b6b291a18392413a625bb15cd35d7eed85e;hpb=cd7bdd4076ca154575bbef85eb2157e59befcfe2;p=chaz%2Ftar diff --git a/src/xheader.c b/src/xheader.c index c8c54b6..361f684 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -1,6 +1,7 @@ /* POSIX extended headers for tar. - Copyright (C) 2003-2007, 2009-2010, 2012-2013 Free Software Foundation, Inc. + Copyright (C) 2003-2007, 2009-2010, 2012-2014 Free Software + Foundation, Inc. This file is part of GNU tar. @@ -754,6 +755,16 @@ xheader_decode (struct tar_stat_info *st) continue; } run_override_list (keyword_override_list, st); + + /* The archived (effective) file size is always set directly in tar header + field, possibly overridden by "size" extended header - in both cases, + result is now decoded in st->stat.st_size */ + st->archive_file_size = st->stat.st_size; + + /* The real file size (given by stat()) may be redefined for sparse + files in "GNU.sparse.realsize" extended header */ + if (st->real_size_set) + st->stat.st_size = st->real_size; } static void @@ -1359,7 +1370,10 @@ sparse_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; + { + st->real_size_set = 1; + st->real_size = u; + } } static void