From: Tobias Stoeckmann Date: Sun, 19 Jul 2026 20:43:52 +0000 (+0200) Subject: tar: Verify that huge files are not written X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=91fa66073ef29db6106d58b751767199dcde499f;p=thirdparty%2Flibarchive.git tar: Verify that huge files are not written Files which cannot fit into a stream should never return success, which can happen due to truncation on 32 bit systems. Signed-off-by: Tobias Stoeckmann --- diff --git a/Makefile.am b/Makefile.am index d91f79beb..68c30dba5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -673,6 +673,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_write_format_cpio_odc.c \ libarchive/test/test_write_format_gnutar.c \ libarchive/test/test_write_format_gnutar_filenames.c \ + libarchive/test/test_write_format_gnutar_huge.c \ libarchive/test/test_write_format_iso9660.c \ libarchive/test/test_write_format_iso9660_boot.c \ libarchive/test/test_write_format_iso9660_bugs.c \ diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index 76bb025e8..4989b94b6 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -302,6 +302,7 @@ IF(ENABLE_TEST) test_write_format_cpio_odc.c test_write_format_gnutar.c test_write_format_gnutar_filenames.c + test_write_format_gnutar_huge.c test_write_format_iso9660.c test_write_format_iso9660_boot.c test_write_format_iso9660_empty.c diff --git a/libarchive/test/test_write_format_gnutar_huge.c b/libarchive/test/test_write_format_gnutar_huge.c new file mode 100644 index 000000000..c0a4b7e00 --- /dev/null +++ b/libarchive/test/test_write_format_gnutar_huge.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2026 Tobias Stoeckmann + * All rights reserved. + * + * 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 "archive.h" +#include "test.h" + +DEFINE_TEST(test_write_format_gnutar_huge) +{ + struct archive_entry *ae; + struct archive *a; + size_t buffsize = 8192; + size_t used; + char *buff; + + /* Create a new archive in memory. */ + assert((buff = malloc(buffsize)) != NULL); + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_gnutar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + /* Create an entry with INT64_MAX bytes. */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, "file"); + archive_entry_set_size(ae, INT64_MAX); + archive_entry_set_filetype(ae, AE_IFREG); + + /* Try to write entry into archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + assertEqualIntA(a, ARCHIVE_FATAL, archive_write_finish_entry(a)); + + archive_entry_free(ae); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + free(buff); +}