]> granicus.if.org Git - php/commitdiff
Use better fix for preventing too early freeing of interned strings
authorBob Weinand <bobwei9@hotmail.com>
Thu, 6 Oct 2016 08:36:12 +0000 (10:36 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 6 Oct 2016 08:36:25 +0000 (10:36 +0200)
Works also with opcache now - just prevent zend_interned_strings_restore completely - zend_interned_strings_dtor will take care as phpdbg only ever uses one single request cycle per module cycle

sapi/phpdbg/phpdbg.c
sapi/phpdbg/phpdbg_list.c

index a7fda1ddd28fcd78f589178fbe6a8ae48ffa2c79..bda5b5619f1e1c594f347408046eb0b4d850f427 100644 (file)
@@ -797,13 +797,17 @@ static zend_module_entry sapi_phpdbg_module_entry = {
        STANDARD_MODULE_PROPERTIES
 };
 
+static void phpdbg_interned_strings_nothing(void) { }
+
 static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* {{{ */
 {
        if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) {
                return FAILURE;
        }
+       /* prevent zend_interned_strings_restore from invalidating our string pointers too early (in phpdbg allocated memory only gets freed after module shutdown) */
+       zend_interned_strings_restore = phpdbg_interned_strings_nothing;
 
-       phpdbg_booted=1;
+       phpdbg_booted = 1;
 
        return SUCCESS;
 } /* }}} */
index dd0187cfbe7e77701126fec43d0793ea401a55f0..86a2132b7401410a23543814511655b7fa57a299 100644 (file)
@@ -317,17 +317,6 @@ zend_op_array *phpdbg_init_compile_file(zend_file_handle *file, int type) {
        dataptr = zend_hash_str_find_ptr(&PHPDBG_G(file_sources), filename, strlen(filename));
        ZEND_ASSERT(dataptr != NULL);
 
-       if (op_array->vars) {
-               int i;
-               /* un-intern these strings to prevent zend_interned_strings_restore from invalidating our string pointers too early (in phpdbg allocated memory only gets freed after module shutdown) */
-               for (i = 0; i < op_array->last_var; i++) {
-                       zend_string **s = op_array->vars + i;
-                       if (ZSTR_IS_INTERNED(*s)) {
-                               *s = zend_string_init(ZSTR_VAL(*s), ZSTR_LEN(*s), 0);
-                       }
-               }
-       }
-
        dataptr->op_array = *op_array;
        if (dataptr->op_array.refcount) {
                ++*dataptr->op_array.refcount;