Skip to content

Commit f2bf834

Browse files
committed
ext/soap: to_zval_array() native stack overflow on cyclic encoded references.
Fix #22984 The array and apache Map decoders never registered the node being decoded, unlike to_zval_object_ex(), so a child href or enc:ref pointing back at an enclosing array recursed until the native stack was exhausted. An empty holder is now registered before the children are converted, and replaced by the completed value afterwards.
1 parent a72e063 commit f2bf834

1 file changed

Lines changed: 20 additions & 0 deletions

File tree

ext/soap/php_encoding.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,16 @@ static void soap_add_xml_ref(zval *data, xmlNodePtr node)
380380
}
381381
}
382382

383+
static void soap_add_xml_ref_holder(zval *data, xmlNodePtr node)
384+
{
385+
if (SOAP_GLOBAL(ref_map)) {
386+
zval holder;
387+
388+
array_init(&holder);
389+
zend_hash_index_update(SOAP_GLOBAL(ref_map), (zend_ulong)node, &holder);
390+
}
391+
}
392+
383393
static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xmlNodePtr parent, int check_class_map)
384394
{
385395
xmlNodePtr node = NULL;
@@ -2536,6 +2546,9 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
25362546

25372547
ZVAL_NULL(ret);
25382548
FIND_XML_NULL(data, ret);
2549+
if (soap_check_xml_ref(ret, data)) {
2550+
return ret;
2551+
}
25392552

25402553
if (data &&
25412554
(attr = get_attribute(data->properties,"arrayType")) &&
@@ -2672,6 +2685,7 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
26722685
}
26732686

26742687
array_init(ret);
2688+
soap_add_xml_ref_holder(ret, data);
26752689
trav = data->children;
26762690
while (trav) {
26772691
if (trav->type == XML_ELEMENT_NODE) {
@@ -2729,6 +2743,7 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
27292743
}
27302744
efree(dims);
27312745
efree(pos);
2746+
soap_add_xml_ref(ret, data);
27322747
return ret;
27332748
}
27342749

@@ -2798,9 +2813,13 @@ static zval *to_zval_map(zval *ret, encodeTypePtr type, xmlNodePtr data)
27982813

27992814
ZVAL_NULL(ret);
28002815
FIND_XML_NULL(data, ret);
2816+
if (soap_check_xml_ref(ret, data)) {
2817+
return ret;
2818+
}
28012819

28022820
if (data && data->children) {
28032821
array_init(ret);
2822+
soap_add_xml_ref_holder(ret, data);
28042823
trav = data->children;
28052824

28062825
trav = data->children;
@@ -2830,6 +2849,7 @@ static zval *to_zval_map(zval *ret, encodeTypePtr type, xmlNodePtr data)
28302849
zval_ptr_dtor(&key);
28312850
}
28322851
ENDFOREACH(trav);
2852+
soap_add_xml_ref(ret, data);
28332853
} else {
28342854
ZVAL_NULL(ret);
28352855
}

0 commit comments

Comments
 (0)