From edae40239e64f8ea6c03d28601c9e7403a354f65 Mon Sep 17 00:00:00 2001 From: Roman Donchenko Date: Mon, 6 Jul 2015 17:54:19 +0300 Subject: [PATCH] cmArchiveWrite: do not store sparse files when using standard tar formats Sparse files in tars are a GNU extension that libarchive will use if it detects holes in the input file, even when using the standard pax/paxr formats. Not all tar implementations can handle sparse files; in particular, the internal implementation dpkg uses to extract packages can't. To maximize archive portability, turn this feature off by clearing the sparseness information from archive entries. --- Source/cmArchiveWrite.cxx | 11 ++++++++++- Source/cmArchiveWrite.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx index 72818f50a..44d0d4ec4 100644 --- a/Source/cmArchiveWrite.cxx +++ b/Source/cmArchiveWrite.cxx @@ -84,7 +84,8 @@ cmArchiveWrite::cmArchiveWrite( Stream(os), Archive(archive_write_new()), Disk(archive_read_disk_new()), - Verbose(false) + Verbose(false), + Format(format) { switch (c) { @@ -282,6 +283,14 @@ bool cmArchiveWrite::AddFile(const char* file, archive_entry_acl_clear(e); archive_entry_xattr_clear(e); archive_entry_set_fflags(e, 0, 0); + + if (this->Format == "pax" || this->Format == "paxr") + { + // Sparse files are a GNU tar extension. + // Do not use them in standard tar files. + archive_entry_sparse_clear(e); + } + if(archive_write_header(this->Archive, e) != ARCHIVE_OK) { this->Error = "archive_write_header: "; diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h index 794cb282c..e6f515ddc 100644 --- a/Source/cmArchiveWrite.h +++ b/Source/cmArchiveWrite.h @@ -84,6 +84,7 @@ private: struct archive* Archive; struct archive* Disk; bool Verbose; + std::string Format; std::string Error; std::string MTime; };