From: Greg Beaver Date: Fri, 21 Mar 2008 19:54:07 +0000 (+0000) Subject: fix the memleak - but this breaks the \*compressAllFiles\*() methods because of fatal... X-Git-Tag: RELEASE_2_0_0a1~58 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=891067c9750622bab7ca3af967e864c5867d7103;p=php fix the memleak - but this breaks the \*compressAllFiles\*() methods because of fatal flaw in renaming implementation - see pecl-dev email for details --- diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index e6680a401f..be5c763fed 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2442,8 +2442,7 @@ PHP_METHOD(Phar, compressAllFilesGZ) } phar_obj->arc.archive->is_modified = 1; -/* EXPERIMENT: REMOVING THIS LINE TO SEE THE IMPACT ON VALGRIND RESULTS, WILL BREAK TESTS */ - /* phar_rename_archive(phar_obj->arc.archive, NULL, 1 TSRMLS_CC); */ + phar_rename_archive(phar_obj->arc.archive, NULL, 1 TSRMLS_CC); phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC); if (error) { diff --git a/ext/phar/util.c b/ext/phar/util.c index 6f38a17c8a..092134c2bc 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -77,6 +77,7 @@ void phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool compress char *oldname = NULL, *oldpath = NULL; char *basename = NULL, *basepath = NULL; char *newname = NULL, *newpath = NULL; + dtor_func_t save; if (phar->flags && compress) { char *error; @@ -158,6 +159,12 @@ void phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool compress zend_hash_update(&(PHAR_GLOBALS->phar_alias_map), newpath, strlen(newpath), (void*)&phar, sizeof(phar_archive_data*), NULL); } + /* remove old guy, add new guy */ + save = PHAR_GLOBALS->phar_fname_map.pDestructor; + /* don't destruct, we are only renaming */ + PHAR_GLOBALS->phar_fname_map.pDestructor = NULL; + zend_hash_del(&(PHAR_GLOBALS->phar_fname_map), oldpath, phar->fname_len); + PHAR_GLOBALS->phar_fname_map.pDestructor = save; zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), newpath, strlen(newpath), (void*)&phar, sizeof(phar_archive_data*), NULL); efree(phar->fname);