]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Relax sanity checks of number fields in tar header even more.
authorMartin Matuska <martin@matuska.org>
Mon, 5 Dec 2016 00:05:12 +0000 (01:05 +0100)
committerMartin Matuska <martin@matuska.org>
Mon, 5 Dec 2016 00:43:17 +0000 (01:43 +0100)
This fixes reading tar archives created by plexus-archiver (used e.g. by
maven-assembly-plugin to create source and binary tar distributions)
version 2.6.2 and lower. These archives may have entries with uid and gid
header fields filled with spaces without any octal digits.

Fixes #832

Makefile.am
libarchive/archive_read_support_format_tar.c
libarchive/test/CMakeLists.txt
libarchive/test/test_compat_plexus_archiver_tar.c [new file with mode: 0644]
libarchive/test/test_compat_plexus_archiver_tar.tar.uu [new file with mode: 0644]

index 74485af962d6e737cd90505e156d42bb6d374349..906f0ddf13a1d7bc4030c94b864aef851ab01357 100644 (file)
@@ -371,6 +371,7 @@ libarchive_test_SOURCES= \
        libarchive/test/test_compat_mac.c \
        libarchive/test/test_compat_pax_libarchive_2x.c \
        libarchive/test/test_compat_perl_archive_tar.c \
+       libarchive/test/test_compat_plexus_archiver_tar.c \
        libarchive/test/test_compat_solaris_tar_acl.c \
        libarchive/test/test_compat_solaris_pax_sparse.c \
        libarchive/test/test_compat_star_acl_posix1e.c \
@@ -627,6 +628,7 @@ libarchive_test_EXTRA_DIST=\
        libarchive/test/test_compat_mac-2.tar.Z.uu \
        libarchive/test/test_compat_pax_libarchive_2x.tar.Z.uu \
        libarchive/test/test_compat_perl_archive_tar.tar.uu \
+       libarchive/test/test_compat_plexus_archiver_tar.uu \
        libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu \
        libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu \
        libarchive/test/test_compat_solaris_tar_acl.tar.uu \
index 071d766b74b7f464715702606f65e41fc76b29f6..b3db34d78bbd466a7d6680432abf08b758cd60b6 100644 (file)
@@ -324,11 +324,7 @@ validate_number_field(const char* p_field, size_t i_size)
                while (i < i_size && p_field[i] == ' ') {
                        ++i;
                }
-               /* Must be at least one octal digit. */
-               if (i >= i_size || p_field[i] < '0' || p_field[i] > '7') {
-                       return 0;
-               }
-               /* Skip remaining octal digits. */
+               /* Skip octal digits. */
                while (i < i_size && p_field[i] >= '0' && p_field[i] <= '7') {
                        ++i;
                }
index 5dad2191021d25e9982ebc0c04eae340c285ecb5..ab9a8a46d66a2cdb35737f9e813b8bdbb5119043 100644 (file)
@@ -59,6 +59,7 @@ IF(ENABLE_TEST)
     test_compat_mac.c
     test_compat_pax_libarchive_2x.c
     test_compat_perl_archive_tar.c
+    test_compat_plexus_archiver_tar.c
     test_compat_solaris_pax_sparse.c
     test_compat_solaris_tar_acl.c
     test_compat_star_acl_posix1e.c
diff --git a/libarchive/test/test_compat_plexus_archiver_tar.c b/libarchive/test/test_compat_plexus_archiver_tar.c
new file mode 100644 (file)
index 0000000..0f8bedc
--- /dev/null
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2016 Martin Matuska
+ * 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 "test.h"
+__FBSDID("$FreeBSD");
+
+/*
+ * Verify our ability to read sample files created by plexus-archiver version
+ * 2.6.2 and lower (project switched to Apache Commons Compress with 2.6.3).
+ * 
+ * These files may have tar entries with uid and gid header fields filled with
+ * spaces without any octal digit.
+ */
+
+DEFINE_TEST(test_compat_plexus_archiver_tar)
+{
+       char name[] = "test_compat_plexus_archiver_tar.tar";
+       struct archive_entry *ae;
+       struct archive *a;
+       int r;
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       extract_reference_file(name);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name,
+           10240));
+
+       /* Read first entry. */
+       assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae));
+       if (r != ARCHIVE_OK) {
+               archive_read_free(a);
+               return;
+       }
+       assertEqualString("commons-logging-1.2/NOTICE.txt",
+           archive_entry_pathname(ae));
+       assertEqualInt(1404583896, archive_entry_mtime(ae));
+       assertEqualInt(0100664, archive_entry_mode(ae));
+       assertEqualInt(0, archive_entry_uid(ae));
+       assertEqualInt(0, archive_entry_gid(ae));
+
+       /* Verify that the format detection worked. */
+       assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE);
+       assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
+
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
diff --git a/libarchive/test/test_compat_plexus_archiver_tar.tar.uu b/libarchive/test/test_compat_plexus_archiver_tar.tar.uu
new file mode 100644 (file)
index 0000000..39d7b11
--- /dev/null
@@ -0,0 +1,49 @@
+begin 644 test_compat_plexus_archiver_tar.tar
+M8V]M;6]N<RUL;V=G:6YG+3$N,B].3U1)0T4N='AT````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````#$P,#8V-"``("`@("`@(``@("`@("`@`"`@("`@("`@,C8Q
+M(#$R,S4V,#,W-S,P("`Q-#$U-P`@,```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!U<W1A<@```'1N````
+M````````````````````````````````````=&X`````````````````````
+M```````````````````@("`@(#`@`"`@("`@,"``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!!<&%C:&4@0V]M;6]N<R!,;V=G:6YG"D-O<'ER
+M:6=H="`R,#`S+3(P,30@5&AE($%P86-H92!3;V9T=V%R92!&;W5N9&%T:6]N
+M"@I4:&ES('!R;V1U8W0@:6YC;'5D97,@<V]F='=A<F4@9&5V96QO<&5D(&%T
+M"E1H92!!<&%C:&4@4V]F='=A<F4@1F]U;F1A=&EO;B`H:'1T<#HO+W=W=RYA
+M<&%C:&4N;W)G+RDN"@H`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+7``````````````````````````````H`
+`
+end