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