]> granicus.if.org Git - php/commitdiff
Don't make expectations about non-constant zval refcauntability
authorDmitry Stogov <dmitry@zend.com>
Fri, 16 Feb 2018 12:37:04 +0000 (15:37 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 16 Feb 2018 12:37:04 +0000 (15:37 +0300)
Zend/zend_execute.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 21c8ed7b6b7f36fe8bfb552df21e8e89e6259054..5da2e2d9b12fe4900495d63a3e90c4bc03a02934 100644 (file)
@@ -92,10 +92,14 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
                        garbage = Z_COUNTED_P(variable_ptr);
                        if (GC_DELREF(garbage) == 0) {
                                ZVAL_COPY_VALUE(variable_ptr, value);
-                               if (value_type & (IS_CONST|IS_CV)) {
+                               if (ZEND_CONST_COND(value_type  == IS_CONST, 0)) {
                                        if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
                                                Z_ADDREF_P(variable_ptr);
                                        }
+                               } else if (value_type & (IS_CONST|IS_CV)) {
+                                       if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
+                                               Z_ADDREF_P(variable_ptr);
+                                       }
                                } else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) {
                                        if (UNEXPECTED(GC_DELREF(ref) == 0)) {
                                                efree_size(ref, sizeof(zend_reference));
@@ -115,10 +119,14 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
        } while (0);
 
        ZVAL_COPY_VALUE(variable_ptr, value);
-       if (value_type & (IS_CONST|IS_CV)) {
+       if (ZEND_CONST_COND(value_type == IS_CONST, 0)) {
                if (UNEXPECTED(Z_OPT_REFCOUNTED_P(variable_ptr))) {
                        Z_ADDREF_P(variable_ptr);
                }
+       } else if (value_type & (IS_CONST|IS_CV)) {
+               if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
+                       Z_ADDREF_P(variable_ptr);
+               }
        } else if (ZEND_CONST_COND(value_type == IS_VAR, 1) && UNEXPECTED(ref)) {
                if (UNEXPECTED(GC_DELREF(ref) == 0)) {
                        efree_size(ref, sizeof(zend_reference));
index c82dcd6115b5181f54a531931152472ecb97a5a5..d50a78b588722c0fc8e1e9097176f6e644f3d00a 100644 (file)
@@ -6100,7 +6100,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
                zend_refcounted *gc = Z_COUNTED_P(value);
 
                ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
-               if (EXPECTED(Z_TYPE_INFO_REFCOUNTED(value_type))) {
+               if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
                        GC_ADDREF(gc);
                }
        }
index 256ec2a1462ed9b8e86cbfbf55fc9319a83e0ea4..e7166571cc620bef52855aac58c0ec2077a884ef 100644 (file)
@@ -22325,7 +22325,7 @@ fe_fetch_r_exit:
                zend_refcounted *gc = Z_COUNTED_P(value);
 
                ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
-               if (EXPECTED(Z_TYPE_INFO_REFCOUNTED(value_type))) {
+               if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
                        GC_ADDREF(gc);
                }
        }