]> granicus.if.org Git - php/commitdiff
fix the memleak - but this breaks the \*compressAllFiles\*() methods because of fatal...
authorGreg Beaver <cellog@php.net>
Fri, 21 Mar 2008 19:54:07 +0000 (19:54 +0000)
committerGreg Beaver <cellog@php.net>
Fri, 21 Mar 2008 19:54:07 +0000 (19:54 +0000)
in renaming implementation - see pecl-dev email for details

ext/phar/phar_object.c
ext/phar/util.c

index e6680a401f085a99145eaa3e49d4bd502275e3cd..be5c763fed1cea213e7a4d3a15603284bc3374e2 100755 (executable)
@@ -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) {
index 6f38a17c8a69d5750acbd0226ac316e578fa83bd..092134c2bc550789bf7c65c7748ad1b6dd52c129 100644 (file)
@@ -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);