diff options
author | Stanislav Malyshev <stas@php.net> | 2015-07-06 22:58:28 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2015-07-06 22:58:28 -0700 |
commit | 61b0b803884d168c8e25e6770fc4311ad616fc08 (patch) | |
tree | 7664cdc36f13f1e94e5dfa364e7d9e9f4d829c7d | |
parent | c938d2f537c81c5162edcda330d2081b09077030 (diff) | |
download | php-git-61b0b803884d168c8e25e6770fc4311ad616fc08.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 1184863de9..507b609e56 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2089,9 +2089,10 @@ static int phar_copy_file_contents(phar_entry_info *entry, php_stream *fp TSRMLS } /* }}} */ -static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool compress TSRMLS_DC) /* {{{ */ +static zval *phar_rename_archive(phar_archive_data **sphar, char *ext, zend_bool compress TSRMLS_DC) /* {{{ */ { const char *oldname = NULL; + phar_archive_data *phar = *sphar; char *oldpath = NULL; char *basename = NULL, *basepath = NULL; char *newname = NULL, *newpath = NULL; @@ -2198,6 +2199,7 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c (*pphar)->fp = phar->fp; phar->fp = NULL; phar_destroy_phar_data(phar TSRMLS_CC); + *sphar = NULL; phar = *pphar; phar->refcount++; newpath = oldpath; @@ -2413,17 +2415,19 @@ no_copy: phar_add_virtual_dirs(phar, newentry.filename, newentry.filename_len TSRMLS_CC); } - if ((ret = phar_rename_archive(phar, ext, 0 TSRMLS_CC))) { + if ((ret = phar_rename_archive(&phar, ext, 0 TSRMLS_CC))) { 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; } } |