1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.4'

* PHP-8.4:
  Reapply GH-17712 with a fix for internal class constants (#18464)
This commit is contained in:
Daniel Scherzer
2025-05-25 16:51:18 -07:00
5 changed files with 80 additions and 16 deletions

3
NEWS
View File

@@ -49,6 +49,9 @@ PHP NEWS
. Added get_error_handler(), get_exception_handler() functions. (Arnaud)
. Fixed bug GH-15753 and GH-16198 (Bind traits before parent class). (ilutov)
. Added support for casts in constant expressions. (nielsdos)
. Fixed bugs GH-17711 and GH-18022 (Infinite recursion on deprecated attribute
evaluation) and GH-18464 (Recursion protection for deprecation constants not
released on bailout). (DanielEScherzer and ilutov)
- Curl:
. Added curl_multi_get_handles(). (timwolla)

View File

@@ -0,0 +1,20 @@
--TEST--
GH-18463: Recursion protection should not be applied to internal class constants
--EXTENSIONS--
zend_test
--FILE--
<?php
function handler($errno, $errstr, $errfile, $errline) {
echo "$errstr in $errfile on line $errline\n";
eval('class string {}');
}
set_error_handler('handler');
var_dump(_ZendTestClass::ZEND_TEST_DEPRECATED);
?>
--EXPECTF--
Constant _ZendTestClass::ZEND_TEST_DEPRECATED is deprecated in %s on line %d
Fatal error: Cannot use "string" as a class name as it is reserved in %s(%d) : eval()'d code on line %d

View File

@@ -373,9 +373,15 @@ ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string *
if (UNEXPECTED(ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED)) {
if ((flags & ZEND_FETCH_CLASS_SILENT) == 0 && !CONST_IS_RECURSIVE(c)) {
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
CONST_PROTECT_RECURSION(c);
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
goto failure;
}

View File

@@ -6156,10 +6156,15 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
}
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));

54
Zend/zend_vm_execute.h generated
View File

@@ -7669,9 +7669,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -8874,9 +8879,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -25970,9 +25980,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -26542,9 +26557,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -35385,9 +35405,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -35747,9 +35772,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
if (UNEXPECTED(is_constant_deprecated) && !CONST_IS_RECURSIVE(c)) {
CONST_PROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
/* Recursion protection only applied to user constants, GH-18463 */
CONST_PROTECT_RECURSION(c);
}
zend_deprecated_class_constant(c, constant_name);
CONST_UNPROTECT_RECURSION(c);
if (c->ce->type == ZEND_USER_CLASS) {
CONST_UNPROTECT_RECURSION(c);
}
if (EG(exception)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));