]> granicus.if.org Git - php/commitdiff
Workaroud for inconsistent ZVALs in AST produced by compiler (strings may be REFCOUNT...
authorDmitry Stogov <dmitry@zend.com>
Tue, 31 Oct 2017 12:39:39 +0000 (15:39 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 31 Oct 2017 12:39:39 +0000 (15:39 +0300)
Zend/zend_ast.c

index 26177c2c726a3b46d1a0c6035936395821d76fb1..884caf2be2c9cd810e3a4790c2983ec2f24f452c 100644 (file)
@@ -565,6 +565,8 @@ ZEND_API zend_ast_ref *zend_ast_copy(zend_ast *ast)
 }
 
 ZEND_API void zend_ast_destroy(zend_ast *ast) {
+       zval *zv;
+
        if (!ast) {
                return;
        }
@@ -574,7 +576,13 @@ ZEND_API void zend_ast_destroy(zend_ast *ast) {
                        /* Destroy value without using GC: When opcache moves arrays into SHM it will
                         * free the zend_array structure, so references to it from outside the op array
                         * become invalid. GC would cause such a reference in the root buffer. */
-                       zval_ptr_dtor_nogc(zend_ast_get_zval(ast));
+                       zv = zend_ast_get_zval(ast);
+                       if (Z_TYPE_P(zv) == IS_STRING) {
+                               /* Compiler may keep REFCOUNTED zvals with INTERNED strings */
+                               zend_string_release(Z_STR_P(zv));
+                       } else {
+                               zval_ptr_dtor_nogc(zv);
+                       }
                        break;
                case ZEND_AST_CONSTANT:
                        zend_string_release(zend_ast_get_constant_name(ast));