@@ -2136,6 +2136,13 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
21362136 xmlNodePtr xparam ;
21372137
21382138 if (data && Z_TYPE_P (data ) == IS_ARRAY ) {
2139+ if (UNEXPECTED (Z_IS_RECURSIVE_P (data ))) {
2140+ zend_value_error ("Recursive array cannot be encoded" );
2141+ return ;
2142+ }
2143+
2144+ GC_TRY_PROTECT_RECURSION (Z_ARRVAL_P (data ));
2145+
21392146 ZEND_HASH_FOREACH_VAL_IND (Z_ARRVAL_P (data ), zdata ) {
21402147 if (j >= dims [0 ]) {
21412148 break ;
@@ -2184,6 +2191,8 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
21842191 j ++ ;
21852192 }
21862193 }
2194+
2195+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
21872196 } else {
21882197 for (j = 0 ; j < dims [0 ]; j ++ ) {
21892198 if (dimension == 1 ) {
@@ -2701,6 +2710,13 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
27012710 FIND_ZVAL_NULL (data , xmlParam , style );
27022711
27032712 if (Z_TYPE_P (data ) == IS_ARRAY ) {
2713+ if (UNEXPECTED (Z_IS_RECURSIVE_P (data ))) {
2714+ zend_value_error ("Recursive array cannot be encoded" );
2715+ return NULL ;
2716+ }
2717+
2718+ GC_TRY_PROTECT_RECURSION (Z_ARRVAL_P (data ));
2719+
27042720 ZEND_HASH_FOREACH_KEY_VAL_IND (Z_ARRVAL_P (data ), int_val , key_val , temp_data ) {
27052721 item = xmlNewNode (NULL , BAD_CAST ("item" ));
27062722 xmlAddChild (xmlParam , item );
@@ -2728,6 +2744,8 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
27282744 xparam = master_to_xml (get_conversion (Z_TYPE_P (temp_data )), temp_data , style , item );
27292745 xmlNodeSetName (xparam , BAD_CAST ("value" ));
27302746 } ZEND_HASH_FOREACH_END ();
2747+
2748+ GC_TRY_UNPROTECT_RECURSION (Z_ARRVAL_P (data ));
27312749 }
27322750 if (style == SOAP_ENCODED ) {
27332751 set_ns_and_type (xmlParam , type );
0 commit comments