]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
plug crashes in archive_read_support_filter_XXX
authorRoman Neuhauser <neuhauser@sigpipe.cz>
Sun, 10 Apr 2011 09:13:35 +0000 (05:13 -0400)
committerRoman Neuhauser <neuhauser@sigpipe.cz>
Sun, 10 Apr 2011 09:13:35 +0000 (05:13 -0400)
these functions lacked protection by archive_check_magic.

SVN-Revision: 3195

12 files changed:
Makefile.am
libarchive/archive_read_support_filter_all.c
libarchive/archive_read_support_filter_bzip2.c
libarchive/archive_read_support_filter_compress.c
libarchive/archive_read_support_filter_gzip.c
libarchive/archive_read_support_filter_none.c
libarchive/archive_read_support_filter_rpm.c
libarchive/archive_read_support_filter_uu.c
libarchive/archive_read_support_filter_xz.c
libarchive/test/CMakeLists.txt
libarchive/test/test_archive_read_support.h [new file with mode: 0644]
libarchive/test/test_archive_read_support_filter_torture.c [new file with mode: 0644]

index 6bfaa1230c2de5afbc7a625c268a02ff37f6ed67..b515c44f9b281ab7bf72066c1dc0f7dc5e08bc42 100644 (file)
@@ -253,6 +253,7 @@ libarchive_test_SOURCES=                                    \
        libarchive/test/test_archive_read_set_format_option.c   \
        libarchive/test/test_archive_read_set_option.c          \
        libarchive/test/test_archive_read_set_options.c         \
+       libarchive/test/test_archive_read_support_filter_torture.c      \
        libarchive/test/test_archive_set_error.c                \
        libarchive/test/test_archive_string.c                   \
        libarchive/test/test_archive_write_set_filter_option.c  \
index 01eba82e7c7c9ab12874b5e6edee4a90e39fc169..263e8815341a65446e712d7f3b166fdf8c93534b 100644 (file)
@@ -27,6 +27,7 @@
 __FBSDID("$FreeBSD$");
 
 #include "archive.h"
+#include "archive_private.h"
 
 #if ARCHIVE_VERSION_NUMBER >= 4000000
 #warning archive_read_support_compression_all
@@ -41,6 +42,9 @@ archive_read_support_filter_all(struct archive *a)
 int
 archive_read_support_compression_all(struct archive *a)
 {
+       archive_check_magic(a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_all");
+
        /* Bzip falls back to "bunzip2" command-line */
        archive_read_support_filter_bzip2(a);
        /* The decompress code doesn't use an outside library. */
index 894ddc9072b61eeb6eac97c2dfc187722ab2629a..35f66d8b444203809fc2f3395eb738a73434d4b3 100644 (file)
@@ -88,6 +88,9 @@ archive_read_support_compression_bzip2(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *reader;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_bzip2");
+
        if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 7ca02545b3009839ac668b06732726ffe403268c..aafd7f27108877d41f3e0d7ec2c6f475cbccb6c8 100644 (file)
@@ -157,6 +157,9 @@ archive_read_support_compression_compress(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_compress");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 51fdba8ce981afc7407f055f8965428e609cd601..c66280425b194ee0eebcabf297b4750871ba01ba 100644 (file)
@@ -94,6 +94,9 @@ archive_read_support_compression_gzip(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_gzip");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 9530ccb771cbeaf31b5476d07457238612fe04af..92ddf25c225f256ebd2430fbe96a8a76055b3569 100644 (file)
@@ -27,6 +27,7 @@
 __FBSDID("$FreeBSD$");
 
 #include "archive.h"
+#include "archive_private.h"
 
 #if ARCHIVE_VERSION_NUMBER >= 4000000
 #warning archive_read_support_compression_none
@@ -45,6 +46,8 @@ archive_read_support_filter_none(struct archive *a)
 int
 archive_read_support_compression_none(struct archive *a)
 {
-       (void)a; /* UNUSED */
+       archive_check_magic(a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_none");
+
        return (ARCHIVE_OK);
 }
index 81f35c81449896fe589367919aeed0eb82964b27..6d249ef1f85234cc99682a7d48f527e8f5ecad26 100644 (file)
@@ -79,6 +79,9 @@ archive_read_support_compression_rpm(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_rpm");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 95dd5e2e982d80ea95260bbe295a765c6fb28376..12f4240802b9635fc5eb6e0160ef0d095d3d7257 100644 (file)
@@ -79,6 +79,9 @@ archive_read_support_compression_uu(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_uu");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 6f05d68a67eee3fcf84defeec3e493e3f418afc5..929b5968bbd04be1c937daee440b72428d2b4bf0 100644 (file)
@@ -130,6 +130,9 @@ archive_read_support_compression_xz(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_xz");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
@@ -163,6 +166,9 @@ archive_read_support_compression_lzma(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_lzma");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
@@ -198,6 +204,9 @@ archive_read_support_compression_lzip(struct archive *_a)
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter_bidder *bidder;
 
+       archive_check_magic(_a, ARCHIVE_READ_MAGIC,
+           ARCHIVE_STATE_NEW, "archive_read_support_filter_lzip");
+
        if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)
                return (ARCHIVE_FATAL);
 
index 86fa40eb48a606219859f3e73af8439a995f4c95..523b15f821d113dfcdec026262851ff28a89b372 100644 (file)
@@ -24,6 +24,7 @@ IF(ENABLE_TEST)
     test_archive_read_set_format_option.c
     test_archive_read_set_option.c
     test_archive_read_set_options.c
+    test_archive_read_support_filter_torture.c
     test_archive_set_error.c
     test_archive_string.c
     test_archive_write_set_filter_option.c
diff --git a/libarchive/test/test_archive_read_support.h b/libarchive/test/test_archive_read_support.h
new file mode 100644 (file)
index 0000000..ba84168
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2011 Tim Kientzle
+ * 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.
+ */
+__FBSDID("$FreeBSD$");
+
+typedef struct archive *constructor();
+typedef int enabler(struct archive *);
+typedef int destructor(struct archive *);
+
+static void
+test_success(constructor new_, enabler enable_, destructor free_)
+{
+       struct archive *a = new_();
+       assertEqualIntA(a, ARCHIVE_OK, enable_(a));
+       assert(NULL == archive_error_string(a));
+       assertEqualIntA(a, 0, archive_errno(a));
+       free_(a);
+}
+
+static void
+test_failure(constructor new_, enabler enable_, destructor free_)
+{
+       struct archive *a = new_();
+       assertEqualIntA(a, ARCHIVE_FATAL, enable_(a));
+       assert(NULL != archive_error_string(a));
+       assertEqualIntA(a, -1, archive_errno(a));
+       free_(a);
+}
+
+static void
+test_filter_or_format(enabler enable)
+{
+       test_success(archive_read_new, enable, archive_read_free);
+       test_failure(archive_write_new, enable, archive_write_free);
+       test_failure(archive_read_disk_new, enable, archive_read_free);
+       test_failure(archive_write_disk_new, enable, archive_write_free);
+}
diff --git a/libarchive/test/test_archive_read_support_filter_torture.c b/libarchive/test/test_archive_read_support_filter_torture.c
new file mode 100644 (file)
index 0000000..3131823
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2011 Tim Kientzle
+ * 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$");
+
+#include "test_archive_read_support.h"
+
+DEFINE_TEST(test_archive_read_support_filter_torture)
+{
+       test_filter_or_format(archive_read_support_filter_all);
+       test_filter_or_format(archive_read_support_filter_bzip2);
+       test_filter_or_format(archive_read_support_filter_compress);
+       test_filter_or_format(archive_read_support_filter_gzip);
+       test_filter_or_format(archive_read_support_filter_lzip);
+       test_filter_or_format(archive_read_support_filter_lzma);
+       test_filter_or_format(archive_read_support_filter_none);
+       test_filter_or_format(archive_read_support_filter_rpm);
+       test_filter_or_format(archive_read_support_filter_uu);
+       test_filter_or_format(archive_read_support_filter_xz);
+}