Skip to content

Commit

Permalink
Fix ar archive entries having no type (libarchive#2290)
Browse files Browse the repository at this point in the history
Also removes some whitespace damage.

Closes libarchive#2241
  • Loading branch information
nabijaczleweli authored Sep 1, 2024
1 parent 6e43e20 commit 853bf65
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 3 deletions.
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
6 changes: 3 additions & 3 deletions libarchive/archive_read_support_format_ar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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,
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions libarchive/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
40 changes: 40 additions & 0 deletions libarchive/test/test_ar_mode.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*-SPDX-License-Identifier: BSD-2-Clause
* Copyright (C) 2024 by наб <[email protected]>
*
* 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);
}

0 comments on commit 853bf65

Please sign in to comment.