From d9a5d12bb654df3eb597741e6b7ecdddf477e13a Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Tue, 13 May 2008 01:18:15 -0400 Subject: [PATCH] Fix BSD ar writer to not increase the size of the archive_entry for long filenames. This breaks applications that use archive_entry_size to decide how much to write. SVN-Revision: 48 --- libarchive/archive_write_set_format_ar.c | 11 ++++++----- libarchive/test/test_write_format_ar.c | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libarchive/archive_write_set_format_ar.c b/libarchive/archive_write_set_format_ar.c index 313d0b390..1731844d3 100644 --- a/libarchive/archive_write_set_format_ar.c +++ b/libarchive/archive_write_set_format_ar.c @@ -142,12 +142,15 @@ archive_write_ar_header(struct archive_write *a, struct archive_entry *entry) struct ar_w *ar; const char *pathname; const char *filename; + int64_t size; ret = 0; append_fn = 0; ar = (struct ar_w *)a->format_data; ar->is_strtab = 0; filename = NULL; + size = archive_entry_size(entry); + /* * Reject files with empty name. @@ -285,8 +288,7 @@ archive_write_ar_header(struct archive_write *a, struct archive_entry *entry) return (ARCHIVE_WARN); } append_fn = 1; - archive_entry_set_size(entry, - archive_entry_size(entry) + strlen(filename)); + size += strlen(filename); } } @@ -322,8 +324,7 @@ stat: } size: - if (format_decimal(archive_entry_size(entry), buff + AR_size_offset, - AR_size_size)) { + if (format_decimal(size, buff + AR_size_offset, AR_size_size)) { archive_set_error(&a->archive, ERANGE, "File size out of range"); return (ARCHIVE_WARN); @@ -333,7 +334,7 @@ size: if (ret != ARCHIVE_OK) return (ret); - ar->entry_bytes_remaining = archive_entry_size(entry); + ar->entry_bytes_remaining = size; ar->entry_padding = ar->entry_bytes_remaining % 2; if (append_fn > 0) { diff --git a/libarchive/test/test_write_format_ar.c b/libarchive/test/test_write_format_ar.c index 432557ca1..4bb84a6a6 100644 --- a/libarchive/test/test_write_format_ar.c +++ b/libarchive/test/test_write_format_ar.c @@ -162,6 +162,7 @@ DEFINE_TEST(test_write_format_ar) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, 5); assertA(0 == archive_write_header(a, ae)); + assertA(5 == archive_entry_size(ae)); assertA(5 == archive_write_data(a, "12345", 7)); archive_entry_free(ae); -- 2.47.3