summaryrefslogtreecommitdiff
path: root/core/libarchive
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-01-26 23:14:55 +0000
committerroot <root@rshg054.dnsready.net>2012-01-26 23:14:55 +0000
commit3741146d50cb93e8985f8aac937e36d35ee76446 (patch)
tree98628c2ca15482ec0c66a81db48b4ddd777e1136 /core/libarchive
parenta61c6fb05ec1cbc6845b2ed4077ce0c5950c36ed (diff)
Thu Jan 26 23:14:55 UTC 2012
Diffstat (limited to 'core/libarchive')
-rw-r--r--core/libarchive/PKGBUILD26
-rw-r--r--core/libarchive/interpret-non-posix-zips.patch165
-rw-r--r--core/libarchive/test-with-zip-mtime.patch23
3 files changed, 207 insertions, 7 deletions
diff --git a/core/libarchive/PKGBUILD b/core/libarchive/PKGBUILD
index 75c87cf45..1be3116b4 100644
--- a/core/libarchive/PKGBUILD
+++ b/core/libarchive/PKGBUILD
@@ -1,16 +1,23 @@
-# $Id: PKGBUILD 146703 2012-01-16 19:48:41Z dreisner $
+# $Id: PKGBUILD 147657 2012-01-26 02:44:17Z dreisner $
# Maintainer: Dan McGee <dan@archlinux.org>
+
pkgname=libarchive
pkgver=3.0.3
-pkgrel=2
+pkgrel=3
pkgdesc="library that can create and read several streaming archive formats"
arch=('i686' 'x86_64')
url="http://libarchive.googlecode.com/"
license=('BSD')
depends=('zlib' 'bzip2' 'xz>=5.0.0' 'acl' 'openssl>=1.0.0' 'expat')
-source=("http://libarchive.googlecode.com/files/libarchive-${pkgver}.tar.gz")
-md5sums=('ca4090f0099432a9ac5a8b6618dc3892')
-sha256sums=('c5fc7620f74a54b1717e4aed38aee85dc27a988ad1db7640f28eb63a82ea62d7')
+source=("http://libarchive.googlecode.com/files/libarchive-${pkgver}.tar.gz"
+ 'interpret-non-posix-zips.patch'
+ 'test-with-zip-mtime.patch')
+md5sums=('ca4090f0099432a9ac5a8b6618dc3892'
+ 'f02b88eb10877c7a7d527ed89c662e44'
+ '8366def6d7d70d424fa28a986c78c015')
+sha256sums=('c5fc7620f74a54b1717e4aed38aee85dc27a988ad1db7640f28eb63a82ea62d7'
+ '9d8240a360d61464dfc5a98342f520ad41b0f922261f2ace7ec1fefb8c289bdc'
+ 'b7a8be5c1e3220960a9f67c9779b10d2663e25d72939546b4f01a49f1ee3a61f')
# keep an upgrade path for older installations
PKGEXT='.pkg.tar.gz'
@@ -18,6 +25,12 @@ PKGEXT='.pkg.tar.gz'
build() {
cd "$srcdir/$pkgname-$pkgver"
+ # http://code.google.com/p/libarchive/issues/detail?id=225
+ patch -Np0 <"$srcdir/interpret-non-posix-zips.patch"
+
+ # http://code.google.com/p/libarchive/issues/detail?id=231
+ patch -Np0 <"$srcdir/test-with-zip-mtime.patch"
+
./configure --prefix=/usr --without-xml2
make
}
@@ -25,8 +38,7 @@ build() {
check() {
cd "$srcdir/$pkgname-$pkgver"
- # currently fails on i686 in a minor test involving atime updates (#60)
- make check || :
+ make check
}
package() {
diff --git a/core/libarchive/interpret-non-posix-zips.patch b/core/libarchive/interpret-non-posix-zips.patch
new file mode 100644
index 000000000..63bc439d9
--- /dev/null
+++ b/core/libarchive/interpret-non-posix-zips.patch
@@ -0,0 +1,165 @@
+Index: libarchive/archive_read_support_format_zip.c
+===================================================================
+--- libarchive/archive_read_support_format_zip.c (revision 4189)
++++ libarchive/archive_read_support_format_zip.c (revision 4190)
+@@ -217,14 +217,13 @@
+ }
+
+ /*
+- * TODO: This is a performance sink because it forces
+- * the read core to drop buffered data from the start
+- * of file, which will then have to be re-read again
+- * if this bidder loses.
++ * TODO: This is a performance sink because it forces the read core to
++ * drop buffered data from the start of file, which will then have to
++ * be re-read again if this bidder loses.
+ *
+- * Consider passing in the winning bid value to subsequent
+- * bidders so that this bidder in particular can avoid
+- * seeking if it knows it's going to lose anyway.
++ * We workaround this a little by passing in the best bid so far so
++ * that later bidders can do nothing if they know they'll never
++ * outbid. But we can certainly do better...
+ */
+ static int
+ archive_read_format_zip_seekable_bid(struct archive_read *a, int best_bid)
+@@ -311,19 +310,29 @@
+ external_attributes = archive_le32dec(p + 38);
+ zip_entry->local_header_offset = archive_le32dec(p + 42);
+
++ /* If we can't guess the mode, leave it zero here;
++ when we read the local file header we might get
++ more information. */
++ zip_entry->mode = 0;
+ if (zip_entry->system == 3) {
+ zip_entry->mode = external_attributes >> 16;
+- } else {
+- zip_entry->mode = AE_IFREG | 0777;
+ }
+
+- /* Do we need to parse filename here? */
+- /* Or can we wait until we read the local header? */
++ /* We don't read the filename until we get to the
++ local file header. Reading it here would speed up
++ table-of-contents operations (removing the need to
++ find and read local file header to get the
++ filename) at the cost of requiring a lot of extra
++ space. */
++ /* We don't read the extra block here. We assume it
++ will be duplicated at the local file header. */
+ __archive_read_consume(a,
+ 46 + filename_length + extra_length + comment_length);
+ }
+
+- /* TODO: Sort zip entries. */
++ /* TODO: Sort zip entries by file offset so that we
++ can optimize get_next_header() to use skip instead of
++ seek. */
+
+ return ARCHIVE_OK;
+ }
+@@ -434,6 +443,11 @@
+ return (30);
+ }
+
++ /* TODO: It's worth looking ahead a little bit for a valid
++ * PK signature. In particular, that would make it possible
++ * to read some UUEncoded SFX files or SFX files coming from
++ * a network socket. */
++
+ return (0);
+ }
+
+Index: libarchive/test/test_compat_zip_6.zip.uu
+===================================================================
+--- libarchive/test/test_compat_zip_6.zip.uu (revision 0)
++++ libarchive/test/test_compat_zip_6.zip.uu (revision 4190)
+@@ -0,0 +1,10 @@
++begin 755 test_compat_zip_6.zip
++M4$L#!`H``````'@3-T`````````````````6````3F5W($9O;&1E<B].97<@
++M1F]L9&5R+U!+`P0*``````!\$S=`%4-8OPL````+````*P```$YE=R!&;VQD
++M97(O3F5W($9O;&1E<B].97<@5&5X="!$;V-U;65N="YT>'1S;VUE('1E>'0-
++M"E!+`0(4"PH``````'@3-T`````````````````6````````````$```````
++M``!.97<@1F]L9&5R+TYE=R!&;VQD97(O4$L!`A0+"@``````?!,W0!5#6+\+
++M````"P```"L``````````0`@````-````$YE=R!&;VQD97(O3F5W($9O;&1E
++M<B].97<@5&5X="!$;V-U;65N="YT>'102P4&``````(``@"=````B```````
++`
++end
+Index: libarchive/test/test_compat_zip.c
+===================================================================
+--- libarchive/test/test_compat_zip.c (revision 4189)
++++ libarchive/test/test_compat_zip.c (revision 4190)
+@@ -348,6 +348,53 @@
+ free(p);
+ }
+
++/*
++ * Issue 225: Errors extracting MSDOS Zip archives with directories.
++ */
++static void
++compat_zip_6_verify(struct archive *a)
++{
++ struct archive_entry *ae;
++
++ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
++ assertEqualString("New Folder/New Folder/", archive_entry_pathname(ae));
++ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
++ assertEqualInt(1327314468, archive_entry_mtime(ae));
++ assertEqualInt(0, archive_entry_size(ae));
++ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
++ assertEqualString("New Folder/New Folder/New Text Document.txt", archive_entry_pathname(ae));
++ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
++ assertEqualInt(1327314476, archive_entry_mtime(ae));
++ assertEqualInt(11, archive_entry_size(ae));
++ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
++}
++
++static void
++test_compat_zip_6(void)
++{
++ const char *refname = "test_compat_zip_6.zip";
++ struct archive *a;
++ void *p;
++ size_t s;
++
++ extract_reference_file(refname);
++ p = slurpfile(&s, refname);
++
++ 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));
++ assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 7));
++ compat_zip_6_verify(a);
++ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
++
++ 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));
++ assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 7));
++ compat_zip_6_verify(a);
++ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
++}
++
+ DEFINE_TEST(test_compat_zip)
+ {
+ test_compat_zip_1();
+@@ -355,6 +402,7 @@
+ test_compat_zip_3();
+ test_compat_zip_4();
+ test_compat_zip_5();
++ test_compat_zip_6();
+ }
+
+
+Index: Makefile.am
+===================================================================
+--- Makefile.am (revision 4189)
++++ Makefile.am (revision 4190)
+@@ -462,6 +462,7 @@
+ libarchive/test/test_compat_zip_3.zip.uu \
+ libarchive/test/test_compat_zip_4.zip.uu \
+ libarchive/test/test_compat_zip_5.zip.uu \
++ libarchive/test/test_compat_zip_6.zip.uu \
+ libarchive/test/test_fuzz_1.iso.Z.uu \
+ libarchive/test/test_fuzz.cab.uu \
+ libarchive/test/test_fuzz.lzh.uu \
diff --git a/core/libarchive/test-with-zip-mtime.patch b/core/libarchive/test-with-zip-mtime.patch
new file mode 100644
index 000000000..79e2f3c7e
--- /dev/null
+++ b/core/libarchive/test-with-zip-mtime.patch
@@ -0,0 +1,23 @@
+Index: libarchive/test/test_compat_zip.c
+===================================================================
+--- libarchive/test/test_compat_zip.c (revision 4197)
++++ libarchive/test/test_compat_zip.c (revision 4198)
+@@ -359,12 +359,16 @@
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("New Folder/New Folder/", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+- assertEqualInt(1327314468, archive_entry_mtime(ae));
++ /* Zip timestamps are local time, so vary by time zone. */
++ /* TODO: A more complex assert would work here; we could
++ verify that it's within +/- 24 hours of a particular value. */
++ /* assertEqualInt(1327314468, archive_entry_mtime(ae)); */
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("New Folder/New Folder/New Text Document.txt", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+- assertEqualInt(1327314476, archive_entry_mtime(ae));
++ /* Zip timestamps are local time, so vary by time zone. */
++ /* assertEqualInt(1327314476, archive_entry_mtime(ae)); */
+ assertEqualInt(11, archive_entry_size(ae));
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+ }