From ea9c2354bac56ec7fc9c9d613c1706bf13809962 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Tue, 25 Jun 2019 15:17:52 -0700 Subject: [PATCH] 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. --- libarchive/archive_read_disk_posix.c | 2 ++ libarchive/archive_read_disk_windows.c | 2 ++ 2 files changed, 4 insertions(+) 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); -- 2.47.2