@@ -2149,6 +2149,13 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
21492149 xmlNodePtr xparam ;
21502150
21512151 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+
21522159 ZEND_HASH_FOREACH_VAL_IND (Z_ARRVAL_P (data ), zdata ) {
21532160 if (j >= dims [0 ]) {
21542161 break ;
@@ -2197,6 +2204,8 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
21972204 j ++ ;
21982205 }
21992206 }
2207+
2208+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
22002209 } else {
22012210 for (j = 0 ; j < dims [0 ]; j ++ ) {
22022211 if (dimension == 1 ) {
@@ -2714,6 +2723,13 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
27142723 FIND_ZVAL_NULL (data , xmlParam , style );
27152724
27162725 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+
27172733 ZEND_HASH_FOREACH_KEY_VAL_IND (Z_ARRVAL_P (data ), int_val , key_val , temp_data ) {
27182734 item = xmlNewNode (NULL , BAD_CAST ("item" ));
27192735 xmlAddChild (xmlParam , item );
@@ -2741,6 +2757,8 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
27412757 xparam = master_to_xml (get_conversion (Z_TYPE_P (temp_data )), temp_data , style , item );
27422758 xmlNodeSetName (xparam , BAD_CAST ("value" ));
27432759 } ZEND_HASH_FOREACH_END ();
2760+
2761+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
27442762 }
27452763 if (style == SOAP_ENCODED ) {
27462764 set_ns_and_type (xmlParam , type );
0 commit comments