mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Merge branch 'PHP-8.4'
This commit is contained in:
commit
90d2f8abfd
2 changed files with 53 additions and 0 deletions
39
Zend/tests/gh18572.phpt
Normal file
39
Zend/tests/gh18572.phpt
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
--TEST--
|
||||||
|
GH-18572: Nested object comparison leading to stack overflow
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (getenv('SKIP_ASAN')) die('skip as it fatally crash');
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
#[AllowDynamicProperties]
|
||||||
|
class Node {
|
||||||
|
public $next;
|
||||||
|
// forcing dynamic property creation is key
|
||||||
|
}
|
||||||
|
|
||||||
|
$first = new Node();
|
||||||
|
$first->previous = $first;
|
||||||
|
$first->next = $first;
|
||||||
|
|
||||||
|
$cur = $first;
|
||||||
|
|
||||||
|
for ($i = 0; $i < 50000; $i++) {
|
||||||
|
$new = new Node();
|
||||||
|
$new->previous = $cur;
|
||||||
|
$cur->next = $new;
|
||||||
|
$new->next = $first;
|
||||||
|
$first->previous = $new;
|
||||||
|
$cur = $new;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Force comparison manually to trigger zend_hash_compare
|
||||||
|
$first == $cur;
|
||||||
|
} catch(Error $e) {
|
||||||
|
echo $e->getMessage(). PHP_EOL;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--EXPECTREGEX--
|
||||||
|
(Maximum call stack size reached during object comparison|Fatal error: Nesting level too deep - recursive dependency?.+)
|
|
@ -46,6 +46,15 @@
|
||||||
#define IN_ISSET ZEND_GUARD_PROPERTY_ISSET
|
#define IN_ISSET ZEND_GUARD_PROPERTY_ISSET
|
||||||
#define IN_HOOK ZEND_GUARD_PROPERTY_HOOK
|
#define IN_HOOK ZEND_GUARD_PROPERTY_HOOK
|
||||||
|
|
||||||
|
static zend_always_inline bool zend_objects_check_stack_limit(void)
|
||||||
|
{
|
||||||
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
||||||
|
return zend_call_stack_overflowed(EG(stack_limit));
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
__X accessors explanation:
|
__X accessors explanation:
|
||||||
|
|
||||||
|
@ -2122,6 +2131,11 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_object *zobj1, *zobj2;
|
zend_object *zobj1, *zobj2;
|
||||||
|
|
||||||
|
if (zend_objects_check_stack_limit()) {
|
||||||
|
zend_throw_error(NULL, "Maximum call stack size reached during object comparison");
|
||||||
|
return ZEND_UNCOMPARABLE;
|
||||||
|
}
|
||||||
|
|
||||||
if (Z_TYPE_P(o1) != Z_TYPE_P(o2)) {
|
if (Z_TYPE_P(o1) != Z_TYPE_P(o2)) {
|
||||||
/* Object and non-object */
|
/* Object and non-object */
|
||||||
zval *object;
|
zval *object;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue