]> granicus.if.org Git - php/commitdiff
Temorary fix for implicit IS_CV conversion into IS_INDIRECTR
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:17:08 +0000 (15:17 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Feb 2014 11:17:08 +0000 (15:17 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 3e377470a4089f87e9cbd7817a731d40b558ee95..4b3fd98e92dd70a3a07addb0d03c444ba273df10 100644 (file)
@@ -3357,7 +3357,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
        SAVE_OPLINE();
 
        params = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
-       Z_DELREF_P(params);
+       if (Z_REFCOUNTED_P(params)) Z_DELREF_P(params);
 
        if (arg_num <= arg_count) {
                array_init_size(params, arg_count - arg_num + 1);
@@ -3368,6 +3368,10 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
        for (; arg_num <= arg_count; ++arg_num) {
                zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
+//??? "params" may became IS_INDIRECT because of symtable initialization in zend_error
+               if (Z_TYPE_P(params) == IS_INDIRECT) {
+                       params = Z_INDIRECT_P(params);
+               }
                zend_hash_next_index_insert(Z_ARRVAL_P(params), param);
                if (Z_REFCOUNTED_P(param)) {
                        Z_ADDREF_P(param);
index 51ec30e733f45b87a15041f4af5faabbc56b275a..d6e73260afbab094478da6fe43055c366a127841 100644 (file)
@@ -889,7 +889,7 @@ static int ZEND_FASTCALL  ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_AR
        SAVE_OPLINE();
 
        params = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
-       Z_DELREF_P(params);
+       if (Z_REFCOUNTED_P(params)) Z_DELREF_P(params);
 
        if (arg_num <= arg_count) {
                array_init_size(params, arg_count - arg_num + 1);
@@ -900,6 +900,10 @@ static int ZEND_FASTCALL  ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_AR
        for (; arg_num <= arg_count; ++arg_num) {
                zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
+//??? "params" may became IS_INDIRECT because of symtable initialization in zend_error
+               if (Z_TYPE_P(params) == IS_INDIRECT) {
+                       params = Z_INDIRECT_P(params);
+               }
                zend_hash_next_index_insert(Z_ARRVAL_P(params), param);
                if (Z_REFCOUNTED_P(param)) {
                        Z_ADDREF_P(param);