@@ -2149,6 +2149,13 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
2149
2149
xmlNodePtr xparam ;
2150
2150
2151
2151
if (data && Z_TYPE_P (data ) == IS_ARRAY ) {
2152
+ if (UNEXPECTED (Z_IS_RECURSIVE_P (data ))) {
2153
+ zend_value_error ("Recursive array cannot be encoded" );
2154
+ return ;
2155
+ }
2156
+
2157
+ GC_TRY_PROTECT_RECURSION (Z_ARRVAL_P (data ));
2158
+
2152
2159
ZEND_HASH_FOREACH_VAL_IND (Z_ARRVAL_P (data ), zdata ) {
2153
2160
if (j >= dims [0 ]) {
2154
2161
break ;
@@ -2197,6 +2204,8 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
2197
2204
j ++ ;
2198
2205
}
2199
2206
}
2207
+
2208
+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
2200
2209
} else {
2201
2210
for (j = 0 ; j < dims [0 ]; j ++ ) {
2202
2211
if (dimension == 1 ) {
@@ -2714,6 +2723,13 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
2714
2723
FIND_ZVAL_NULL (data , xmlParam , style );
2715
2724
2716
2725
if (Z_TYPE_P (data ) == IS_ARRAY ) {
2726
+ if (UNEXPECTED (Z_IS_RECURSIVE_P (data ))) {
2727
+ zend_value_error ("Recursive array cannot be encoded" );
2728
+ return NULL ;
2729
+ }
2730
+
2731
+ GC_TRY_PROTECT_RECURSION (Z_ARRVAL_P (data ));
2732
+
2717
2733
ZEND_HASH_FOREACH_KEY_VAL_IND (Z_ARRVAL_P (data ), int_val , key_val , temp_data ) {
2718
2734
item = xmlNewNode (NULL , BAD_CAST ("item" ));
2719
2735
xmlAddChild (xmlParam , item );
@@ -2741,6 +2757,8 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
2741
2757
xparam = master_to_xml (get_conversion (Z_TYPE_P (temp_data )), temp_data , style , item );
2742
2758
xmlNodeSetName (xparam , BAD_CAST ("value" ));
2743
2759
} ZEND_HASH_FOREACH_END ();
2760
+
2761
+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
2744
2762
}
2745
2763
if (style == SOAP_ENCODED ) {
2746
2764
set_ns_and_type (xmlParam , type );
0 commit comments