]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix ar archive entries having no type (#2290)
authorнаб <nabijaczleweli@nabijaczleweli.xyz>
Sun, 1 Sep 2024 04:11:23 +0000 (06:11 +0200)
committerGitHub <noreply@github.com>
Sun, 1 Sep 2024 04:11:23 +0000 (21:11 -0700)
Also removes some whitespace damage.

Closes #2241

Makefile.am
libarchive/archive_read_support_format_ar.c
libarchive/test/CMakeLists.txt
libarchive/test/test_ar_mode.c [new file with mode: 0644]

index c3adef95fc52ad0718f0ab6d65976477b176ee07..326280cde7785bfdf53142cc425a95eb95323b50 100644 (file)
@@ -371,6 +371,7 @@ libarchive_test_SOURCES= \
        libarchive/test/test_acl_platform_posix1e.c \
        libarchive/test/test_acl_posix1e.c \
        libarchive/test/test_acl_text.c \
+       libarchive/test/test_ar_mode.c \
        libarchive/test/test_archive_api_feature.c \
        libarchive/test/test_archive_clear_error.c \
        libarchive/test/test_archive_cmdline.c \
index 6f1be8591fef66e84469b841d050b0e967927c1e..b0d1ddbc5a0af728674469036cfbe9cad2b5dcbe 100644 (file)
@@ -439,9 +439,9 @@ archive_read_format_ar_read_header(struct archive_read *a,
        if ((header_data = __archive_read_ahead(a, 60, NULL)) == NULL)
                /* Broken header. */
                return (ARCHIVE_EOF);
-       
+
        unconsumed = 60;
-       
+
        ret = _ar_read_header(a, entry, ar, (const char *)header_data, &unconsumed);
 
        if (unconsumed)
@@ -458,7 +458,6 @@ ar_parse_common_header(struct ar *ar, struct archive_entry *entry,
        uint64_t n;
 
        /* Copy remaining header */
-       archive_entry_set_filetype(entry, AE_IFREG);
        archive_entry_set_mtime(entry,
            (time_t)ar_atol10(h + AR_date_offset, AR_date_size), 0L);
        archive_entry_set_uid(entry,
@@ -467,6 +466,7 @@ ar_parse_common_header(struct ar *ar, struct archive_entry *entry,
            (gid_t)ar_atol10(h + AR_gid_offset, AR_gid_size));
        archive_entry_set_mode(entry,
            (mode_t)ar_atol8(h + AR_mode_offset, AR_mode_size));
+       archive_entry_set_filetype(entry, AE_IFREG);
        n = ar_atol10(h + AR_size_offset, AR_size_size);
 
        ar->entry_offset = 0;
index 0352a1e7f60b8f9ddcadb6dd69fb9e0644cc6215..d9aa273eddabfdb1ca676b1aede637b3ed11a5f2 100644 (file)
@@ -15,6 +15,7 @@ IF(ENABLE_TEST)
     test_acl_platform_posix1e.c
     test_acl_posix1e.c
     test_acl_text.c
+    test_ar_mode.c
     test_archive_api_feature.c
     test_archive_clear_error.c
     test_archive_cmdline.c
diff --git a/libarchive/test/test_ar_mode.c b/libarchive/test/test_ar_mode.c
new file mode 100644 (file)
index 0000000..4f9feb1
--- /dev/null
@@ -0,0 +1,40 @@
+/*-SPDX-License-Identifier: BSD-2-Clause
+ * Copyright (C) 2024 by наб <nabijaczleweli@nabijaczleweli.xyz>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+
+static const char data[] = "!<arch>\narchivemount.1/ 0           0     0     644     0         `\n";
+
+
+DEFINE_TEST(test_ar_mode)
+{
+       struct archive * ar = archive_read_new();
+       assertEqualInt(archive_read_support_format_all(ar), ARCHIVE_OK);
+       assertEqualInt(archive_read_open_memory(ar, data, sizeof(data) - 1), ARCHIVE_OK);
+
+       struct archive_entry * entry;
+       assertEqualIntA(ar, archive_read_next_header(ar, &entry), ARCHIVE_OK);
+       assertEqualIntA(ar, archive_entry_mode(entry), S_IFREG | 0644);
+
+       archive_read_free(ar);
+}