diff options
| author | Greg Beaver <cellog@php.net> | 2008-03-21 19:54:07 +0000 |
|---|---|---|
| committer | Greg Beaver <cellog@php.net> | 2008-03-21 19:54:07 +0000 |
| commit | 891067c9750622bab7ca3af967e864c5867d7103 (patch) | |
| tree | 37d599a45d2905f8c3b4aed8772272fe844a1732 /ext/phar | |
| parent | 384d50b37bf0e9d82e5b8845dd6007b756d78fd8 (diff) | |
| download | php-git-891067c9750622bab7ca3af967e864c5867d7103.tar.gz | |
fix the memleak - but this breaks the \*compressAllFiles\*() methods because of fatal flaw
in renaming implementation - see pecl-dev email for details
Diffstat (limited to 'ext/phar')
| -rwxr-xr-x | ext/phar/phar_object.c | 3 | ||||
| -rw-r--r-- | ext/phar/util.c | 7 |
2 files changed, 8 insertions, 2 deletions
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); |
