From 3e920038ecd8cc123b0c8dd957f94a8e1a616c0c Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 30 Jun 2019 11:31:54 +0200 Subject: tar reader: also store condensed size of sparse files Signed-off-by: David Oberhollenzer --- lib/tar/read_header.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/tar/read_header.c b/lib/tar/read_header.c index 44a38f9..5d2a808 100644 --- a/lib/tar/read_header.c +++ b/lib/tar/read_header.c @@ -613,16 +613,6 @@ int read_header(int fd, tar_header_decoded_t *out) goto fail; continue; case TAR_TYPE_GNU_SPARSE: - if (!(set_by_pax & PAX_SIZE)) { - if (read_number(hdr.tail.gnu.realsize, - sizeof(hdr.tail.gnu.realsize), - &pax_size)) - goto fail; - - out->sb.st_size = pax_size; - set_by_pax |= PAX_SIZE; - } - free_sparse_list(out->sparse); out->sparse = read_gnu_old_sparse(fd, &hdr); if (out->sparse == NULL) @@ -635,6 +625,15 @@ int read_header(int fd, tar_header_decoded_t *out) if (decode_header(&hdr, set_by_pax, out, version)) goto fail; + if (hdr.typeflag == TAR_TYPE_GNU_SPARSE) { + if (read_number(hdr.tail.gnu.realsize, + sizeof(hdr.tail.gnu.realsize), &pax_size)) + goto fail; + + out->sparse_size = out->sb.st_size; + out->sb.st_size = pax_size; + } + return 0; out_eof: clear_header(out); -- cgit v1.2.3