mirror of
https://github.com/php/php-src.git
synced 2024-09-22 18:37:25 +00:00
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix symtable cache being used while cleaning symtable
This commit is contained in:
commit
882862563a
19
Zend/tests/symtable_cache_recursive_dtor.phpt
Normal file
19
Zend/tests/symtable_cache_recursive_dtor.phpt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
--TEST--
|
||||||
|
Symtable cache slots may be acquired while cleaning symtable
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class A {
|
||||||
|
// Must be larger than the symtable cache.
|
||||||
|
static $max = 40;
|
||||||
|
function __destruct() {
|
||||||
|
if (self::$max-- < 0) return;
|
||||||
|
$x = 'y';
|
||||||
|
$$x = new a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new A;
|
||||||
|
|
||||||
|
?>
|
||||||
|
===DONE===
|
||||||
|
--EXPECT--
|
||||||
|
===DONE===
|
@ -3396,12 +3396,13 @@ ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_val
|
|||||||
|
|
||||||
ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{ */
|
ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{ */
|
||||||
{
|
{
|
||||||
|
/* Clean before putting into the cache, since clean could call dtors,
|
||||||
|
* which could use the cached hash. Also do this before the check for
|
||||||
|
* available cache slots, as those may be used by a dtor as well. */
|
||||||
|
zend_symtable_clean(symbol_table);
|
||||||
if (EG(symtable_cache_ptr) >= EG(symtable_cache_limit)) {
|
if (EG(symtable_cache_ptr) >= EG(symtable_cache_limit)) {
|
||||||
zend_array_destroy(symbol_table);
|
zend_array_destroy(symbol_table);
|
||||||
} else {
|
} else {
|
||||||
/* clean before putting into the cache, since clean
|
|
||||||
could call dtors, which could use cached hash */
|
|
||||||
zend_symtable_clean(symbol_table);
|
|
||||||
*(EG(symtable_cache_ptr)++) = symbol_table;
|
*(EG(symtable_cache_ptr)++) = symbol_table;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user