From: наб Date: Sun, 1 Sep 2024 04:11:23 +0000 (+0200) Subject: Fix ar archive entries having no type (#2290) X-Git-Tag: v3.7.5~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=853bf656ef6d294a4fedc9afc74b262c3c0a6501;p=thirdparty%2Flibarchive.git Fix ar archive entries having no type (#2290) Also removes some whitespace damage. Closes #2241 --- diff --git a/Makefile.am b/Makefile.am index c3adef95f..326280cde 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ diff --git a/libarchive/archive_read_support_format_ar.c b/libarchive/archive_read_support_format_ar.c index 6f1be8591..b0d1ddbc5 100644 --- a/libarchive/archive_read_support_format_ar.c +++ b/libarchive/archive_read_support_format_ar.c @@ -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; diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index 0352a1e7f..d9aa273ed 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -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 index 000000000..4f9feb121 --- /dev/null +++ b/libarchive/test/test_ar_mode.c @@ -0,0 +1,40 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (C) 2024 by наб + * + * 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[] = "!\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); +}