diff options
author | Stanislav Malyshev <stas@php.net> | 2015-07-06 22:58:28 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2015-07-07 10:17:54 -0700 |
commit | 3bee16a70ab38cebad36d6276dafaef40715cfe8 (patch) | |
tree | a4228ad4c20dcfd60a395429592aef8835bbfb3b | |
parent | d8aa5675ad2ead0469c15fad167ecbdd60051716 (diff) | |
download | php-git-3bee16a70ab38cebad36d6276dafaef40715cfe8.tar.gz |
Better fix for bug #69958
-rw-r--r-- | ext/phar/phar_object.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index ebb15f047a..dd65a08bbe 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1996,9 +1996,10 @@ static int phar_copy_file_contents(phar_entry_info *entry, php_stream *fp) /* {{ } /* }}} */ -static zend_object *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool compress) /* {{{ */ +static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext, zend_bool compress) /* {{{ */ { const char *oldname = NULL; + phar_archive_data *phar = *sphar; char *oldpath = NULL; char *basename = NULL, *basepath = NULL; char *newname = NULL, *newpath = NULL; @@ -2108,6 +2109,7 @@ static zend_object *phar_rename_archive(phar_archive_data *phar, char *ext, zend pphar->fp = phar->fp; phar->fp = NULL; phar_destroy_phar_data(phar); + *sphar = NULL; phar = pphar; phar->refcount++; newpath = oldpath; @@ -2290,17 +2292,19 @@ no_copy: phar_add_virtual_dirs(phar, newentry.filename, newentry.filename_len); } ZEND_HASH_FOREACH_END(); - if ((ret = phar_rename_archive(phar, ext, 0))) { + if ((ret = phar_rename_archive(&phar, ext, 0))) { return ret; } else { - zend_hash_destroy(&(phar->manifest)); - zend_hash_destroy(&(phar->mounted_dirs)); - zend_hash_destroy(&(phar->virtual_dirs)); - if (phar->fp) { - php_stream_close(phar->fp); + if(phar != NULL) { + zend_hash_destroy(&(phar->manifest)); + zend_hash_destroy(&(phar->mounted_dirs)); + zend_hash_destroy(&(phar->virtual_dirs)); + if (phar->fp) { + php_stream_close(phar->fp); + } + efree(phar->fname); + efree(phar); } - efree(phar->fname); - efree(phar); return NULL; } } |