Better fix for bug #69958
authorStanislav Malyshev <stas@php.net>
Tue, 7 Jul 2015 05:58:28 +0000 (22:58 -0700)
committerStanislav Malyshev <stas@php.net>
Tue, 7 Jul 2015 05:58:28 +0000 (22:58 -0700)
ext/phar/phar_object.c

index 1184863de9063b10e54018310ef3791173c717b8..507b609e565a50d300107b17e6e2133f9a5c642b 100644 (file)
@@ -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;
        }
 }