]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix BSD ar writer to not increase the size of the archive_entry
authorJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Tue, 13 May 2008 05:18:15 +0000 (01:18 -0400)
committerJoerg Sonnenberger <joerg.sonnenberger@gmail.com>
Tue, 13 May 2008 05:18:15 +0000 (01:18 -0400)
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
libarchive/test/test_write_format_ar.c

index 313d0b390f96c1d9a9a01654605a59ad61c317a9..1731844d339ebd32c2390554ee7bb4f7527d5896 100644 (file)
@@ -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) {
index 432557ca1fff0a10e2ad89f9e807c9be8f8f277d..4bb84a6a615cfff8a809d9d80437199482ca01ff 100644 (file)
@@ -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);