summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--php-pecl-zip.spec27
-rw-r--r--zip-upstream.patch205
2 files changed, 217 insertions, 15 deletions
diff --git a/php-pecl-zip.spec b/php-pecl-zip.spec
index fd2db02..32d69ca 100644
--- a/php-pecl-zip.spec
+++ b/php-pecl-zip.spec
@@ -12,13 +12,12 @@
%else
%global with_libzip 0
%endif
-%global with_zts 0%{?__ztsphp:1}
Summary: A ZIP archive management extension
Summary(fr): Une extension de gestion des ZIP
Name: php-pecl-zip
Version: 1.12.2
-Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
+Release: 2%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
%if %{with_libzip}
License: PHP
%else
@@ -30,6 +29,8 @@ URL: http://pecl.php.net/package/zip
Source: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz
+Patch0: %{pecl_name}-upstream.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: php-devel
%if %{with_libzip}
@@ -66,10 +67,12 @@ Zip est une extension pour créer et lire les archives au format ZIP.
%setup -c -q
cd %{pecl_name}-%{version}
+%patch0 -p1
%if %{with_libzip}
-# delete bundled libzip to ensure it is not used (except zipint.h)
-rm lib/*.c
+sed -e '/LICENSE_libzip/d' -i ../package.xml
+# delete bundled libzip to ensure it is not used
+rm -r lib
%endif
cd ..
@@ -79,10 +82,8 @@ cat >%{pecl_name}.ini << 'EOF'
extension=%{pecl_name}.so
EOF
-%if %{with_zts}
: Duplicate sources tree for ZTS build
cp -pr %{pecl_name}-%{version} %{pecl_name}-zts
-%endif
%build
@@ -97,7 +98,6 @@ cd %{pecl_name}-%{version}
make %{?_smp_mflags}
-%if %{with_zts}
cd ../%{pecl_name}-zts
%{_bindir}/zts-phpize
%configure \
@@ -108,7 +108,6 @@ cd ../%{pecl_name}-zts
--with-php-config=%{_bindir}/zts-php-config
make %{?_smp_mflags}
-%endif
%install
@@ -120,10 +119,8 @@ install -D -m 644 %{pecl_name}.ini %{buildroot}%{php_inidir}/%{pecl_name}.ini
# Install XML package description
install -D -m 644 package.xml %{buildroot}%{pecl_xmldir}/%{name}.xml
-%if %{with_zts}
make -C %{pecl_name}-zts install INSTALL_ROOT=%{buildroot}
install -D -m 644 %{pecl_name}.ini %{buildroot}%{php_ztsinidir}/%{pecl_name}.ini
-%endif
# Test & Documentation
cd %{pecl_name}-%{version}
@@ -151,7 +148,6 @@ TEST_PHP_EXECUTABLE=%{_bindir}/php \
%{_bindir}/php \
run-tests.php
-%if %{with_zts}
cd ../%{pecl_name}-zts
: minimal load test of ZTS extension
%{_bindir}/zts-php --no-php-ini \
@@ -166,7 +162,6 @@ NO_INTERACTION=1 \
TEST_PHP_EXECUTABLE=%{_bindir}/zts-php \
%{_bindir}/zts-php \
run-tests.php
-%endif
%clean
@@ -190,14 +185,16 @@ fi
%{pecl_xmldir}/%{name}.xml
%config(noreplace) %{php_inidir}/%{pecl_name}.ini
%{php_extdir}/%{pecl_name}.so
-
-%if %{with_zts}
%config(noreplace) %{php_ztsinidir}/%{pecl_name}.ini
%{php_ztsextdir}/%{pecl_name}.so
-%endif
%changelog
+* Thu Oct 24 2013 Remi Collet <remi@fedoraproject.org> 1.12.2-2
+- upstream patch, don't use any libzip private struct
+- drop LICENSE_libzip when system version is used
+- always build ZTS extension
+
* Wed Oct 23 2013 Remi Collet <remi@fedoraproject.org> 1.12.2-1
- update to 1.12.2
- drop merged patches
diff --git a/zip-upstream.patch b/zip-upstream.patch
new file mode 100644
index 0000000..38e9733
--- /dev/null
+++ b/zip-upstream.patch
@@ -0,0 +1,205 @@
+From 746f8a1b4501ae6c364fc531f46fbab3bfd51d1d Mon Sep 17 00:00:00 2001
+From: Remi Collet <fedora@famillecollet.com>
+Date: Wed, 23 Oct 2013 11:12:52 +0200
+Subject: [PATCH] clean 1 use of private lilbzip structure (stay 1)
+
+add a "doubleclose" test to check than nothing wrong occurs
+zip_discard already test is zp is open
+---
+ php_zip.c | 10 ++--------
+ tests/doubleclose.phpt | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 47 insertions(+), 9 deletions(-)
+ create mode 100644 tests/doubleclose.phpt
+
+diff --git a/php_zip.c b/php_zip.c
+index 8943d32..280ef3e 100644
+--- a/php_zip.c
++++ b/php_zip.c
+@@ -1609,7 +1609,7 @@ static ZIPARCHIVE_METHOD(close)
+ ze_zip_object *ze_obj;
+
+ if (!this) {
+- RETURN_FALSE;
++ RETURN_FALSE;
+ }
+
+ ZIP_FROM_OBJECT(intern, this);
+@@ -1617,13 +1617,7 @@ static ZIPARCHIVE_METHOD(close)
+ ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
+
+ if (zip_close(intern)) {
+- /* archive already closed*/
+- if (intern->zp != NULL) {
+- zip_discard(intern);
+- RETVAL_TRUE;
+- } else {
+- RETURN_FALSE;
+- }
++ zip_discard(intern);
+ }
+
+ efree(ze_obj->filename);
+diff --git a/tests/doubleclose.phpt b/tests/doubleclose.phpt
+new file mode 100644
+index 0000000..abc62c8
+--- /dev/null
++++ b/tests/doubleclose.phpt
+@@ -0,0 +1,43 @@
++--TEST--
++close() called twice
++--SKIPIF--
++<?php
++if(!extension_loaded('zip')) die('skip');
++?>
++--FILE--
++<?php
++
++echo "Procedural\n";
++$zip = zip_open(dirname(__FILE__) . '/test.zip');
++if (!is_resource($zip)) {
++ die("Failure");
++ }
++var_dump(zip_close($zip));
++var_dump(zip_close($zip));
++
++echo "Object\n";
++$zip = new ZipArchive();
++if (!$zip->open(dirname(__FILE__) . '/test.zip')) {
++ die('Failure');
++}
++if ($zip->status == ZIPARCHIVE::ER_OK) {
++ var_dump($zip->close());
++ var_dump($zip->close());
++} else {
++ die("Failure");
++}
++
++?>
++Done
++--EXPECTF--
++Procedural
++NULL
++
++Warning: zip_close(): %i is not a valid Zip Directory resource in %s
++bool(false)
++Object
++bool(true)
++
++Warning: ZipArchive::close(): Invalid or uninitialized Zip object in %s
++bool(false)
++Done
+--
+1.8.4
+
+From 5175272e369ba7b781682dfb1a32f4e41c5a28a1 Mon Sep 17 00:00:00 2001
+From: Remi Collet <fedora@famillecollet.com>
+Date: Wed, 23 Oct 2013 13:54:10 +0200
+Subject: [PATCH] add a test to check double call to zip_entry_close
+
+---
+ tests/zip_entry_close.phpt | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+ create mode 100644 tests/zip_entry_close.phpt
+
+diff --git a/tests/zip_entry_close.phpt b/tests/zip_entry_close.phpt
+new file mode 100644
+index 0000000..82b7819
+--- /dev/null
++++ b/tests/zip_entry_close.phpt
+@@ -0,0 +1,24 @@
++--TEST--
++zip_entry_close() function: simple and double call
++--SKIPIF--
++<?php
++/* $Id$ */
++if(!extension_loaded('zip')) die('skip');
++?>
++--FILE--
++<?php
++$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
++$entry = zip_read($zip);
++echo "entry_open: "; var_dump(zip_entry_open($zip, $entry, "r"));
++echo "entry_close: "; var_dump(zip_entry_close($entry));
++echo "entry_close: "; var_dump(zip_entry_close($entry));
++zip_close($zip);
++?>
++Done
++--EXPECTF--
++entry_open: bool(true)
++entry_close: bool(true)
++entry_close:
++Warning: zip_entry_close(): %d is not a valid Zip Entry resource in %s
++bool(false)
++Done
+--
+1.8.4
+
+From 229d87088b5cdd471bcd63d132c7a6af55013b2f Mon Sep 17 00:00:00 2001
+From: Remi Collet <fedora@famillecollet.com>
+Date: Thu, 24 Oct 2013 11:46:44 +0200
+Subject: [PATCH] clean all uses of private libzip structure move check from
+ NULL deref from php ext to in libzip
+
+libzip patch is from upstream
+http://hg.nih.at/libzip?cs=a2f3bb7896c0
+---
+ lib/zip_fclose.c | 14 ++++++++------
+ php_zip.c | 10 +---------
+ 3 files changed, 10 insertions(+), 16 deletions(-)
+
+diff --git a/lib/zip_fclose.c b/lib/zip_fclose.c
+index 611db80..093c30e 100644
+--- a/lib/zip_fclose.c
++++ b/lib/zip_fclose.c
+@@ -48,12 +48,14 @@
+ if (zf->src)
+ zip_source_free(zf->src);
+
+- for (i=0; i<zf->za->nfile; i++) {
+- if (zf->za->file[i] == zf) {
+- zf->za->file[i] = zf->za->file[zf->za->nfile-1];
+- zf->za->nfile--;
+- break;
+- }
++ if (zf->za) {
++ for (i=0; i<zf->za->nfile; i++) {
++ if (zf->za->file[i] == zf) {
++ zf->za->file[i] = zf->za->file[zf->za->nfile-1];
++ zf->za->nfile--;
++ break;
++ }
++ }
+ }
+
+ ret = 0;
+diff --git a/php_zip.c b/php_zip.c
+index 280ef3e..c6591c9 100644
+--- a/php_zip.c
++++ b/php_zip.c
+@@ -30,8 +30,6 @@
+ #include "ext/pcre/php_pcre.h"
+ #include "ext/standard/php_filestat.h"
+ #include "php_zip.h"
+-/* Private struct definition, always use bundled copy */
+-#include "lib/zipint.h"
+
+ /* zip_open is a macro for renaming libzip zipopen, so we need to use PHP_NAMED_FUNCTION */
+ static PHP_NAMED_FUNCTION(zif_zip_open);
+@@ -1183,13 +1181,7 @@ static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+
+ if (zr_rsrc) {
+ if (zr_rsrc->zf) {
+- if (zr_rsrc->zf->za) {
+- zip_fclose(zr_rsrc->zf);
+- } else {
+- if (zr_rsrc->zf->src)
+- zip_source_free(zr_rsrc->zf->src);
+- free(zr_rsrc->zf);
+- }
++ zip_fclose(zr_rsrc->zf);
+ zr_rsrc->zf = NULL;
+ }
+ efree(zr_rsrc);
+--
+1.8.4
+