]> granicus.if.org Git - php/commitdiff
emalloced interned strings have to be deallocated before memory manager shutdown
authorDmitry Stogov <dmitry@zend.com>
Mon, 17 Feb 2014 18:30:35 +0000 (22:30 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 17 Feb 2014 18:30:35 +0000 (22:30 +0400)
Zend/zend_string.c
main/main.c

index 0fda838983f41a4631c21fe874be6462ec3098d0..170cb2c200151aa43afedb0fde9fde9a37acb3af 100644 (file)
@@ -189,10 +189,14 @@ static void zend_interned_strings_restore_int(TSRMLS_D)
        while (idx > 0) {
                idx--;
                p = CG(interned_strings).arData + idx;
-               if (!(p->key->gc.u.v.flags & IS_STR_PERMANENT)) break;
+               if (p->key->gc.u.v.flags & IS_STR_PERMANENT) break;
                CG(interned_strings).nNumUsed--;
                CG(interned_strings).nNumOfElements--;
 
+               p->key->gc.u.v.flags &= ~IS_STR_INTERNED;
+               p->key->gc.refcount = 1;
+               STR_FREE(p->key);
+
                nIndex = p->h & CG(interned_strings).nTableMask;
                if (CG(interned_strings).arHash[nIndex] == idx) {
                        CG(interned_strings).arHash[nIndex] = p->val.u.next;
index 2d12c2060bd663da29a501922f16dd7cae2d95c3..b3dbfa0f8bdb9e04846f7a4bfa19fa7da8d3812d 100644 (file)
@@ -1827,10 +1827,10 @@ void php_request_shutdown(void *dummy)
        } zend_end_try();
 
        /* 14. Free Willy (here be crashes) */
+       zend_interned_strings_restore(TSRMLS_C);
        zend_try {
                shutdown_memory_manager(CG(unclean_shutdown) || !report_memleaks, 0 TSRMLS_CC);
        } zend_end_try();
-       zend_interned_strings_restore(TSRMLS_C);
 
        /* 15. Reset max_execution_time */
        zend_try {