mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #78926: Handle class table reallocation on failed link
This commit is contained in:
commit
8b1b68d3ba
22
Zend/tests/bug78926.phpt
Normal file
22
Zend/tests/bug78926.phpt
Normal file
@ -0,0 +1,22 @@
|
||||
--TEST--
|
||||
Bug #78926: Segmentation fault on Symfony cache:clear
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
spl_autoload_register(function($class) {
|
||||
for ($i = 0; $i < 100; $i++) {
|
||||
eval("class C$i {}");
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
class B extends A {}
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
var_dump(class_exists('B', false));
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
Class 'A' not found
|
||||
bool(false)
|
@ -1118,6 +1118,8 @@ ZEND_API int do_bind_class(zval *lcname, zend_string *lc_parent_name) /* {{{ */
|
||||
}
|
||||
|
||||
if (zend_do_link_class(ce, lc_parent_name) == FAILURE) {
|
||||
/* Reload bucket pointer, the hash table may have been reallocated */
|
||||
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
|
||||
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(rtd_key));
|
||||
return FAILURE;
|
||||
}
|
||||
|
@ -7086,6 +7086,8 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, CONST)
|
||||
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
|
||||
} else {
|
||||
if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
|
||||
/* Reload bucket pointer, the hash table may have been reallocated */
|
||||
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
|
||||
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
@ -7111,7 +7113,6 @@ ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, CACHE_SLOT)
|
||||
if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
|
||||
SAVE_OPLINE();
|
||||
if (zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
|
||||
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, rtd_key);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
|
@ -2366,7 +2366,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE
|
||||
if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
|
||||
SAVE_OPLINE();
|
||||
if (zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
|
||||
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, rtd_key);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
}
|
||||
@ -6229,6 +6228,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_DELAYED_SPEC_CON
|
||||
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
|
||||
} else {
|
||||
if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
|
||||
/* Reload bucket pointer, the hash table may have been reallocated */
|
||||
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
|
||||
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user