From: Martin Matuška Date: Thu, 12 Jun 2025 08:54:08 +0000 (+0200) Subject: Merge pull request #2665 from stoeckmann/read_data_sparse X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0fadc61d5bf0b1543e7dc04bbadd9a54fe27d241;p=thirdparty%2Flibarchive.git Merge pull request #2665 from stoeckmann/read_data_sparse archive_read_data: Handle sparse holes at end of file correctly (cherry picked from commit c3be70e0711b273bfa4f8dc41b8a88848473cec8) --- diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 50db87017..ea58c6ed0 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -834,7 +834,9 @@ archive_read_data(struct archive *_a, void *buff, size_t s) r = archive_read_data_block(a, &read_buf, &a->read_data_remaining, &a->read_data_offset); a->read_data_block = read_buf; - if (r == ARCHIVE_EOF) + if (r == ARCHIVE_EOF && + a->read_data_offset == a->read_data_output_offset && + a->read_data_remaining == 0) return (bytes_read); /* * Error codes are all negative, so the status diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c index 923ae5c65..04dff5b6c 100644 --- a/libarchive/archive_read_support_format_rar.c +++ b/libarchive/archive_read_support_format_rar.c @@ -1117,8 +1117,6 @@ archive_read_format_rar_read_data(struct archive_read *a, const void **buff, if (rar->entry_eof || rar->offset_seek >= rar->unp_size) { *size = 0; *offset = rar->offset; - if (*offset < rar->unp_size) - *offset = rar->unp_size; return (ARCHIVE_EOF); } diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c index 696f959c3..d8f188cf0 100644 --- a/libarchive/archive_read_support_format_warc.c +++ b/libarchive/archive_read_support_format_warc.c @@ -405,7 +405,7 @@ _warc_read(struct archive_read *a, const void **buf, size_t *bsz, int64_t *off) /* it's our lucky day, no work, we can leave early */ *buf = NULL; *bsz = 0U; - *off = w->cntoff + 4U/*for \r\n\r\n separator*/; + *off = w->cntoff; w->unconsumed = 0U; return (ARCHIVE_EOF); } diff --git a/libarchive/archive_read_support_format_xar.c b/libarchive/archive_read_support_format_xar.c index b4e1192ef..36b5ab3ae 100644 --- a/libarchive/archive_read_support_format_xar.c +++ b/libarchive/archive_read_support_format_xar.c @@ -930,7 +930,7 @@ xar_read_data(struct archive_read *a, abort_read_data: *buff = NULL; *size = 0; - *offset = xar->total; + *offset = (int64_t)xar->entry_total; return (r); }