1
0
mirror of https://github.com/php/php-src.git synced 2026-04-22 07:28:09 +02:00

Fixed missed REFCOUNTED checking

This commit is contained in:
Xinchen Hui
2014-02-21 22:39:27 +08:00
parent b96318105b
commit 76c28f878a
+22 -20
View File
@@ -831,31 +831,33 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
zval *param;
if (ARG_SHOULD_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
if (!Z_ISREF(fci->params[i]) && Z_REFCOUNT(fci->params[i]) > 1) {
zval new_zval;
if (Z_REFCOUNTED(fci->params[i])) {
if (!Z_ISREF(fci->params[i]) && Z_REFCOUNT(fci->params[i]) > 1) {
zval new_zval;
if (fci->no_separation &&
!ARG_MAY_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
if (i || UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == (EG(argument_stack)->top))) {
/* hack to clean up the stack */
ZVAL_LONG(&tmp, i);
zend_vm_stack_push(&tmp TSRMLS_CC);
zend_vm_stack_clear_multiple(0 TSRMLS_CC);
if (fci->no_separation &&
!ARG_MAY_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
if (i || UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == (EG(argument_stack)->top))) {
/* hack to clean up the stack */
ZVAL_LONG(&tmp, i);
zend_vm_stack_push(&tmp TSRMLS_CC);
zend_vm_stack_clear_multiple(0 TSRMLS_CC);
}
zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
i+1,
EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name->val : "",
EX(function_state).function->common.scope ? "::" : "",
EX(function_state).function->common.function_name->val);
return FAILURE;
}
zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
i+1,
EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name->val : "",
EX(function_state).function->common.scope ? "::" : "",
EX(function_state).function->common.function_name->val);
return FAILURE;
ZVAL_DUP(&new_zval, &fci->params[i]);
Z_DELREF(fci->params[i]);
ZVAL_COPY_VALUE(&fci->params[i], &new_zval);
}
ZVAL_DUP(&new_zval, &fci->params[i]);
Z_DELREF(fci->params[i]);
ZVAL_COPY_VALUE(&fci->params[i], &new_zval);
Z_ADDREF(fci->params[i]);
}
Z_ADDREF(fci->params[i]);
//??? Z_SET_ISREF_PP(fci->params[i]);
param = &fci->params[i];
} else if (Z_ISREF(fci->params[i]) &&