From: Dmitry Torokhov Date: Tue, 25 Jun 2019 22:17:52 +0000 (-0700) Subject: archive_read_next_header2: clean old entry data X-Git-Tag: v3.4.1~50^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F1218%2Fhead;p=thirdparty%2Flibarchive.git archive_read_next_header2: clean old entry data We need to clean old entry data in archive_read_next_header2 in Windows and Posix disk readers to ensure consistent results. One possible failure mode: sparse data from the previous entry is carried over to next non-sparse file entry, causing it to be mishandled. --- diff --git a/libarchive/archive_read_disk_posix.c b/libarchive/archive_read_disk_posix.c index c4df6c943..87963c3c7 100644 --- a/libarchive/archive_read_disk_posix.c +++ b/libarchive/archive_read_disk_posix.c @@ -1143,6 +1143,8 @@ _archive_read_next_header2(struct archive *_a, struct archive_entry *entry) t->entry_fd = -1; } + archive_entry_clear(entry); + for (;;) { r = next_entry(a, t, entry); if (t->entry_fd >= 0) { diff --git a/libarchive/archive_read_disk_windows.c b/libarchive/archive_read_disk_windows.c index 4a5421f8f..fdd376f9b 100644 --- a/libarchive/archive_read_disk_windows.c +++ b/libarchive/archive_read_disk_windows.c @@ -1126,6 +1126,8 @@ _archive_read_next_header2(struct archive *_a, struct archive_entry *entry) t->entry_fh = INVALID_HANDLE_VALUE; } + archive_entry_clear(entry); + while ((r = next_entry(a, t, entry)) == ARCHIVE_RETRY) archive_entry_clear(entry);