diff options
author | Greg Beaver <cellog@php.net> | 2009-05-24 18:50:58 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2009-05-24 18:50:58 +0000 |
commit | 1c30b43e508438f42822ec5eb41602eaeb2ed8d6 (patch) | |
tree | 06dd1244c1103c3f05db2618785fb290896fa95b | |
parent | 529bcf35c2ba2af80ffe712f00a61cc555ff468f (diff) | |
download | php-git-1c30b43e508438f42822ec5eb41602eaeb2ed8d6.tar.gz |
MFH: fix potential segfault when converting phars with metadata to other formats, add test
-rw-r--r-- | NEWS | 2 | ||||
-rwxr-xr-x | ext/phar/phar_object.c | 16 | ||||
-rw-r--r-- | ext/phar/tests/tar/phar_convert_phar4.phpt | 71 |
3 files changed, 89 insertions, 0 deletions
@@ -19,6 +19,8 @@ PHP NEWS PDO_PGSQL). (Matteo) - Fixed bug #38802 (max_redirects and ignore_errors). (patch by datibbaw@php.net) +- Fixed potential segfault with converting phars containing metadata to other + formats (Greg). 07 May 2009, PHP 5.3.0 RC 2 diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 3cc681752b..6b03e62a45 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2252,6 +2252,22 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char phar->is_temporary_alias = source->is_temporary_alias; phar->alias = source->alias; + if (source->metadata) { + zval *t; + + t = source->metadata; + ALLOC_ZVAL(phar->metadata); + *phar->metadata = *t; + zval_copy_ctor(phar->metadata); +#if PHP_VERSION_ID < 50300 + phar->metadata->refcount = 1; +#else + Z_SET_REFCOUNT_P(phar->metadata, 1); +#endif + + phar->metadata_len = 0; + } + /* first copy each file's uncompressed contents to a temporary file and set per-file flags */ for (zend_hash_internal_pointer_reset(&source->manifest); SUCCESS == zend_hash_has_more_elements(&source->manifest); zend_hash_move_forward(&source->manifest)) { diff --git a/ext/phar/tests/tar/phar_convert_phar4.phpt b/ext/phar/tests/tar/phar_convert_phar4.phpt new file mode 100644 index 0000000000..f23780e1aa --- /dev/null +++ b/ext/phar/tests/tar/phar_convert_phar4.phpt @@ -0,0 +1,71 @@ +--TEST-- +Phar::convertToPhar() with global metadata +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +<?php if (!extension_loaded("zlib")) die("skip"); ?> +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +<?php + +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; +$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '2.phar'; + +$phar = new Phar($fname); +$phar['a.txt'] = 'some text'; +$phar->setMetadata('hi'); +$phar->stopBuffering(); +var_dump($phar->isFileFormat(Phar::TAR)); +var_dump(strlen($phar->getStub())); +var_dump($phar->getMetadata()); + +$phar = $phar->convertToExecutable(Phar::TAR); +var_dump($phar->isFileFormat(Phar::TAR)); +var_dump($phar->getStub()); +var_dump($phar->getMetadata()); + +$phar['a'] = 'hi there'; + +$phar = $phar->convertToExecutable(Phar::PHAR, Phar::GZ); +var_dump($phar->isFileFormat(Phar::PHAR)); +var_dump($phar->isCompressed()); +var_dump(strlen($phar->getStub())); +var_dump($phar->getMetadata()); + +copy($fname . '.gz', $fname2); + +$phar = new Phar($fname2); +var_dump($phar->isFileFormat(Phar::PHAR)); +var_dump($phar->isCompressed() == Phar::GZ); +var_dump(strlen($phar->getStub())); +var_dump($phar->getMetadata()); + +?> +===DONE=== +--CLEAN-- +<?php +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.gz'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz'); +__HALT_COMPILER(); +?> +--EXPECT-- +bool(false) +int(6683) +string(2) "hi" +bool(true) +string(60) "<?php // tar-based phar archive stub file +__HALT_COMPILER();" +string(2) "hi" +bool(true) +int(4096) +int(6683) +string(2) "hi" +bool(true) +bool(true) +int(6683) +string(2) "hi" +===DONE=== |