X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Fxheader.c;fp=src%2Fxheader.c;h=361f684751806c5482d44f9c1fa1ed1f397c6ac7;hp=c94c6d39f1e2437a3caa8ea577d436cd77275143;hb=ec94fbdf458adb2af803eefdd1a9c9bbb432bb21;hpb=c48f4e8f6c849247022c3de8137b1c62f2496cba diff --git a/src/xheader.c b/src/xheader.c index c94c6d3..361f684 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -755,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 @@ -1360,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