mirror of
https://github.com/php/php-src.git
synced 2024-12-14 20:33:36 +08:00
fix mem leak on error, fix cwd issue. go back to BadMethodCallException for Phar->set*CompressedAllFiles(). ALL TESTS PASS, RELEASE IS IMMINENT
This commit is contained in:
parent
996b8e6108
commit
93b387d327
@ -27,8 +27,8 @@ Version 1.0.0
|
||||
streams interface [Greg]
|
||||
X Phar archive metadata Phar::setMetaData($metadata) Phar::getMetaData() [Greg]
|
||||
X support rename() in stream wrapper [Greg]
|
||||
* update docs to reflect changes in error handling
|
||||
* fix 011.phpt, 029.phpt for uncaught exceptions causing bad cleanup
|
||||
X update docs to reflect changes in error handling [Greg]
|
||||
X fix 011.phpt, 029.phpt for uncaught exceptions causing bad cleanup [Marcus/Greg]
|
||||
|
||||
Version 1.1.0
|
||||
|
||||
|
@ -90,7 +90,9 @@ static void phar_destroy_phar_data(phar_archive_data *data TSRMLS_DC) /* {{{ */
|
||||
efree(data->alias);
|
||||
data->alias = NULL;
|
||||
}
|
||||
efree(data->fname);
|
||||
if (data->fname) {
|
||||
efree(data->fname);
|
||||
}
|
||||
if (data->signature) {
|
||||
efree(data->signature);
|
||||
}
|
||||
@ -134,7 +136,7 @@ static void destroy_phar_data_only(void *pDest) /* {{{ */
|
||||
phar_archive_data *phar_data = *(phar_archive_data **) pDest;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
if (--phar_data->refcount < 0) {
|
||||
if (EG(exception) || --phar_data->refcount < 0) {
|
||||
phar_destroy_phar_data(phar_data TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
@ -482,7 +484,7 @@ phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char
|
||||
#define MAPPHAR_FAIL(msg) \
|
||||
efree(savebuf);\
|
||||
if (mydata) {\
|
||||
efree(mydata);\
|
||||
phar_destroy_phar_data(mydata TSRMLS_CC);\
|
||||
}\
|
||||
if (signature) {\
|
||||
efree(signature);\
|
||||
@ -885,6 +887,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int
|
||||
PHAR_GET_32(buffer, entry.flags);
|
||||
if (*(php_uint32 *) buffer) {
|
||||
if (phar_parse_metadata(fp, &buffer, endbuffer, &entry.metadata TSRMLS_CC) == FAILURE) {
|
||||
efree(entry.filename);
|
||||
MAPPHAR_FAIL("unable to read file metadata in .phar file \"%s\"");
|
||||
}
|
||||
} else {
|
||||
@ -895,16 +898,28 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int
|
||||
switch (entry.flags & PHAR_ENT_COMPRESSION_MASK) {
|
||||
case PHAR_ENT_COMPRESSED_GZ:
|
||||
#if !HAVE_ZLIB
|
||||
if (entry.metadata) {
|
||||
zval_ptr_dtor(&entry.metadata);
|
||||
}
|
||||
efree(entry.filename);
|
||||
MAPPHAR_FAIL("zlib extension is required for gz compressed .phar file \"%s\"");
|
||||
#endif
|
||||
break;
|
||||
case PHAR_ENT_COMPRESSED_BZ2:
|
||||
#if !HAVE_BZ2
|
||||
if (entry.metadata) {
|
||||
zval_ptr_dtor(&entry.metadata);
|
||||
}
|
||||
efree(entry.filename);
|
||||
MAPPHAR_FAIL("bz2 extension is required for bzip2 compressed .phar file \"%s\"");
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
if (entry.uncompressed_filesize != entry.compressed_filesize) {
|
||||
if (entry.metadata) {
|
||||
zval_ptr_dtor(&entry.metadata);
|
||||
}
|
||||
efree(entry.filename);
|
||||
MAPPHAR_FAIL("internal corruption of phar \"%s\" (compressed and uncompressed size does not match for uncompressed entry)");
|
||||
}
|
||||
break;
|
||||
@ -2944,7 +2959,7 @@ static php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path
|
||||
/* we must have at the very least phar://alias.phar/ */
|
||||
if (!resource->scheme || !resource->host || !resource->path) {
|
||||
if (resource->host && !resource->path) {
|
||||
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: no directory in \"%s\", must have at least phar://%s/ for root directory", path, resource->host);
|
||||
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)", path, resource->host);
|
||||
php_url_free(resource);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -403,12 +403,12 @@ PHP_METHOD(Phar, compressAllFilesGZ)
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (PHAR_G(readonly)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Phar is readonly, cannot change compression");
|
||||
}
|
||||
#if HAVE_ZLIB
|
||||
if (!pharobj_cancompress(&phar_obj->arc.archive->manifest TSRMLS_CC)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Cannot compress all files as Gzip, some are compressed as bzip2 and cannot be uncompressed");
|
||||
}
|
||||
pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_GZ TSRMLS_CC);
|
||||
@ -416,11 +416,11 @@ PHP_METHOD(Phar, compressAllFilesGZ)
|
||||
|
||||
phar_flush(phar_obj->arc.archive, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, error);
|
||||
efree(error);
|
||||
}
|
||||
#else
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Cannot compress with Gzip compression, zlib extension is not enabled");
|
||||
#endif
|
||||
}
|
||||
@ -437,12 +437,12 @@ PHP_METHOD(Phar, compressAllFilesBZIP2)
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (PHAR_G(readonly)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Phar is readonly, cannot change compression");
|
||||
}
|
||||
#if HAVE_BZ2
|
||||
if (!pharobj_cancompress(&phar_obj->arc.archive->manifest TSRMLS_CC)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Cannot compress all files as Bzip2, some are compressed as gzip and cannot be uncompressed");
|
||||
}
|
||||
pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_BZ2 TSRMLS_CC);
|
||||
@ -450,11 +450,11 @@ PHP_METHOD(Phar, compressAllFilesBZIP2)
|
||||
|
||||
phar_flush(phar_obj->arc.archive, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, error);
|
||||
efree(error);
|
||||
}
|
||||
#else
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Cannot compress with Bzip2 compression, bz2 extension is not enabled");
|
||||
#endif
|
||||
}
|
||||
@ -469,11 +469,11 @@ PHP_METHOD(Phar, uncompressAllFiles)
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (PHAR_G(readonly)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Phar is readonly, cannot change compression");
|
||||
}
|
||||
if (!pharobj_cancompress(&phar_obj->arc.archive->manifest TSRMLS_CC)) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC,
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
|
||||
"Cannot uncompress all files, some are compressed as bzip2 or gzip and cannot be uncompressed");
|
||||
}
|
||||
pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_NONE TSRMLS_CC);
|
||||
@ -481,7 +481,7 @@ PHP_METHOD(Phar, uncompressAllFiles)
|
||||
|
||||
phar_flush(phar_obj->arc.archive, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, error);
|
||||
efree(error);
|
||||
}
|
||||
}
|
||||
|
@ -22,4 +22,4 @@ $dir = opendir('phar://hio');
|
||||
--CLEAN--
|
||||
<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
|
||||
--EXPECTF--
|
||||
Warning: opendir(phar://hio): failed to open dir: phar error: no directory in "phar://hio", must have at least phar://hio/ for root directory in %s on line %d
|
||||
Warning: opendir(phar://hio): failed to open dir: phar error: no directory in "phar://hio", must have at least phar://hio/ for root directory (always use full path to a new phar) in %s on line %d
|
||||
|
@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
Phar: create a Phar with relative path
|
||||
Phar: attempt to create a Phar with relative path
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("phar")) print "skip"; ?>
|
||||
--INI--
|
||||
@ -8,11 +8,12 @@ phar.readonly=0
|
||||
--FILE--
|
||||
<?php
|
||||
chdir(dirname(__FILE__));
|
||||
$p = new Phar('brandnewphar.phar');
|
||||
$p['file1.txt'] = 'hi';
|
||||
$p->commit();
|
||||
var_dump($p->getStub());
|
||||
$p->setStub("<?php
|
||||
try {
|
||||
$p = new Phar('brandnewphar.phar');
|
||||
$p['file1.txt'] = 'hi';
|
||||
$p->commit();
|
||||
var_dump($p->getStub());
|
||||
$p->setStub("<?php
|
||||
function __autoload(\$class)
|
||||
{
|
||||
include 'phar://' . str_replace('_', '/', \$class);
|
||||
@ -21,7 +22,10 @@ Phar::mapPhar('brandnewphar.phar');
|
||||
include 'phar://brandnewphar.phar/startup.php';
|
||||
__HALT_COMPILER();
|
||||
?>");
|
||||
var_dump($p->getStub());
|
||||
var_dump($p->getStub());
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage() . "\n";
|
||||
}
|
||||
?>
|
||||
===DONE===
|
||||
--CLEAN--
|
||||
@ -29,14 +33,5 @@ var_dump($p->getStub());
|
||||
unlink(dirname(__FILE__) . '/brandnewphar.phar');
|
||||
?>
|
||||
--EXPECT--
|
||||
string(24) "<?php __HALT_COMPILER();"
|
||||
string(198) "<?php
|
||||
function __autoload($class)
|
||||
{
|
||||
include 'phar://' . str_replace('_', '/', $class);
|
||||
}
|
||||
Phar::mapPhar('brandnewphar.phar');
|
||||
include 'phar://brandnewphar.phar/startup.php';
|
||||
__HALT_COMPILER();
|
||||
?>"
|
||||
RecursiveDirectoryIterator::__construct(phar://brandnewphar.phar): failed to open dir: phar error: no directory in "phar://brandnewphar.phar", must have at least phar://brandnewphar.phar/ for root directory (always use full path to a new phar)
|
||||
===DONE===
|
Loading…
Reference in New Issue
Block a user