From: Jonas Witschel Date: Sun, 14 Nov 2021 17:56:49 +0000 (+0100) Subject: Add ARCHIVE_READDISK_NO_SPARSE to suppress reading sparse file info X-Git-Tag: v3.6.0~37^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2a8bb4242db773733cca419c8aafd1882c77d75e;p=thirdparty%2Flibarchive.git Add ARCHIVE_READDISK_NO_SPARSE to suppress reading sparse file info Sparse file information depends on the file system and can therefore be a source of unreproducibility for the generated archives, e.g. if the same content is compressed on a file system with and without sparse file support. Add an option to suppress reading this information from disk entirely. --- diff --git a/libarchive/archive.h b/libarchive/archive.h index fbc96bfe7..9fcb63024 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -1024,6 +1024,8 @@ __LA_DECL int archive_read_disk_set_atime_restored(struct archive *); #define ARCHIVE_READDISK_NO_ACL (0x0020) /* Default: File flags are read from disk. */ #define ARCHIVE_READDISK_NO_FFLAGS (0x0040) +/* Default: Sparse file information is read from disk. */ +#define ARCHIVE_READDISK_NO_SPARSE (0x0080) __LA_DECL int archive_read_disk_set_behavior(struct archive *, int flags); diff --git a/libarchive/archive_read_disk.3 b/libarchive/archive_read_disk.3 index 82d6a5c85..a7e376fff 100644 --- a/libarchive/archive_read_disk.3 +++ b/libarchive/archive_read_disk.3 @@ -137,6 +137,9 @@ for more information on extended file attributes. .It Cm ARCHIVE_READDISK_RESTORE_ATIME Restore access time of traversed files. By default, access time of traversed files is not restored. +.It Cm ARCHIVE_READDISK_NO_SPARSE +Do not read sparse file information. +By default, sparse file information is read from disk. .El .It Xo .Fn archive_read_disk_set_symlink_logical , diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 9c9cf38ee..ab0270bc2 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -303,9 +303,11 @@ archive_read_disk_entry_from_file(struct archive *_a, if (r1 < r) r = r1; } - r1 = setup_sparse(a, entry, &fd); - if (r1 < r) - r = r1; + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + r1 = setup_sparse(a, entry, &fd); + if (r1 < r) + r = r1; + } /* If we opened the file earlier in this function, close it. */ if (initial_fd != fd) diff --git a/libarchive/archive_read_disk_windows.c b/libarchive/archive_read_disk_windows.c index 877bc449a..a2587c527 100644 --- a/libarchive/archive_read_disk_windows.c +++ b/libarchive/archive_read_disk_windows.c @@ -1090,9 +1090,11 @@ next_entry(struct archive_read_disk *a, struct tree *t, } /* Find sparse data from the disk. */ - if (archive_entry_hardlink(entry) == NULL && - (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0) - r = setup_sparse_from_disk(a, entry, t->entry_fh); + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + if (archive_entry_hardlink(entry) == NULL && + (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0) + r = setup_sparse_from_disk(a, entry, t->entry_fh); + } } return (r); } @@ -2371,9 +2373,11 @@ archive_read_disk_entry_from_file(struct archive *_a, return (ARCHIVE_OK); } - r = setup_sparse_from_disk(a, entry, h); - if (fd < 0) - CloseHandle(h); + if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { + r = setup_sparse_from_disk(a, entry, h); + if (fd < 0) + CloseHandle(h); + } return (r); }