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:
3
NEWS
3
NEWS
@@ -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)
|
||||
|
||||
20
Zend/tests/constants/gh18463-class-constant.phpt
Normal file
20
Zend/tests/constants/gh18463-class-constant.phpt
Normal 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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
54
Zend/zend_vm_execute.h
generated
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user