mirror of
https://github.com/php/php-src.git
synced 2024-12-14 20:33:36 +08:00
fix potential segfault when converting phars with metadata to other formats, add test
This commit is contained in:
parent
3c48633a8f
commit
ce8cc1c99d
@ -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)) {
|
||||
|
||||
|
71
ext/phar/tests/tar/phar_convert_phar4.phpt
Normal file
71
ext/phar/tests/tar/phar_convert_phar4.phpt
Normal file
@ -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===
|
Loading…
Reference in New Issue
Block a user