Skip to content

Commit

Permalink
Fix usages of zend_update_constant_ex
Browse files Browse the repository at this point in the history
If an in-place update in an external zval is performed, it needs
to incref'd beforehand, not afterwards.
  • Loading branch information
nikic committed Apr 29, 2016
1 parent 416e22d commit a1c405e
Show file tree
Hide file tree
Showing 4 changed files with 3 additions and 13 deletions.
6 changes: 0 additions & 6 deletions Zend/zend_execute_API.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,12 +646,6 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
zend_string_release(Z_STR_P(p));
}
ZVAL_COPY_VALUE(p, const_value);
if (Z_OPT_CONSTANT_P(p)) {
if (UNEXPECTED(zval_update_constant_ex(p, scope) != SUCCESS)) {
RESET_CONSTANT_VISITED(p);
return FAILURE;
}
}
zval_opt_copy_ctor(p);
}
} else if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
Expand Down
3 changes: 1 addition & 2 deletions Zend/zend_ini_parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,10 @@ static void zend_ini_get_constant(zval *result, zval *name)
if (!memchr(Z_STRVAL_P(name), ':', Z_STRLEN_P(name))
&& (c = zend_get_constant(Z_STR_P(name))) != 0) {
if (Z_TYPE_P(c) != IS_STRING) {
ZVAL_COPY_VALUE(&tmp, c);
ZVAL_COPY(&tmp, c);
if (Z_OPT_CONSTANT(tmp)) {
zval_update_constant_ex(&tmp, NULL);
}
zval_opt_copy_ctor(&tmp);
convert_to_string(&tmp);
c = &tmp;
}
Expand Down
4 changes: 1 addition & 3 deletions ext/reflection/php_reflection.c
Original file line number Diff line number Diff line change
Expand Up @@ -2884,11 +2884,9 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
return;
}

ZVAL_COPY_VALUE(return_value, RT_CONSTANT(&param->fptr->op_array, precv->op2));
ZVAL_COPY(return_value, RT_CONSTANT(&param->fptr->op_array, precv->op2));
if (Z_CONSTANT_P(return_value)) {
zval_update_constant_ex(return_value, param->fptr->common.scope);
} else {
zval_copy_ctor(return_value);
}
}
/* }}} */
Expand Down
3 changes: 1 addition & 2 deletions ext/standard/basic_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -3843,13 +3843,12 @@ PHP_FUNCTION(constant)
scope = zend_get_executed_scope();
c = zend_get_constant_ex(const_name, scope, ZEND_FETCH_CLASS_SILENT);
if (c) {
ZVAL_COPY_VALUE(return_value, c);
ZVAL_COPY(return_value, c);
if (Z_CONSTANT_P(return_value)) {
if (UNEXPECTED(zval_update_constant_ex(return_value, scope) != SUCCESS)) {
return;
}
}
zval_copy_ctor(return_value);
} else {
php_error_docref(NULL, E_WARNING, "Couldn't find constant %s", ZSTR_VAL(const_name));
RETURN_NULL();
Expand Down

0 comments on commit a1c405e

Please sign in to comment.