@@ -1735,11 +1735,27 @@ static bool php_dom_is_equal_attr(const xmlAttr *this_attr, const xmlAttr *other
17351735 && php_dom_node_is_content_equal ((const xmlNode * ) this_attr , (const xmlNode * ) other_attr );
17361736}
17371737
1738+ static zend_always_inline bool php_dom_node_is_equal_node_check_stack_limit (void )
1739+ {
1740+ #ifdef ZEND_CHECK_STACK_LIMIT
1741+ return zend_call_stack_overflowed (EG (stack_limit ));
1742+ #else
1743+ return false;
1744+ #endif
1745+ }
1746+
17381747static bool php_dom_node_is_equal_node (const xmlNode * this , const xmlNode * other , bool spec_compliant )
17391748{
17401749 ZEND_ASSERT (this != NULL );
17411750 ZEND_ASSERT (other != NULL );
17421751
1752+ if (UNEXPECTED (php_dom_node_is_equal_node_check_stack_limit ())) {
1753+ if (!EG (exception )) {
1754+ zend_throw_error (NULL , "Maximum call stack size reached." );
1755+ }
1756+ return false;
1757+ }
1758+
17431759 if (this -> type != other -> type ) {
17441760 return false;
17451761 }
@@ -1800,6 +1816,7 @@ static void dom_node_is_equal_node_common(INTERNAL_FUNCTION_PARAMETERS, bool mod
18001816 zval * id , * node ;
18011817 xmlNodePtr otherp , nodep ;
18021818 dom_object * intern ;
1819+ bool result ;
18031820
18041821 id = ZEND_THIS ;
18051822 ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -1822,7 +1839,11 @@ static void dom_node_is_equal_node_common(INTERNAL_FUNCTION_PARAMETERS, bool mod
18221839 RETURN_BOOL (nodep == NULL && otherp == NULL );
18231840 }
18241841
1825- RETURN_BOOL (php_dom_node_is_equal_node (nodep , otherp , modern ));
1842+ result = php_dom_node_is_equal_node (nodep , otherp , modern );
1843+ if (UNEXPECTED (EG (exception ))) {
1844+ RETURN_THROWS ();
1845+ }
1846+ RETURN_BOOL (result );
18261847}
18271848
18281849PHP_METHOD (DOMNode , isEqualNode )
0 commit comments