From: Dmitry Stogov Date: Mon, 6 Nov 2006 16:36:54 +0000 (+0000) Subject: Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client) X-Git-Tag: RELEASE_1_0_0RC1~1117 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae2fc4c4ababbddde76a47903556cb1e4fe9a518;p=php Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client) --- diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c index b688964cf1..065ca8891e 100644 --- a/ext/soap/php_packet_soap.c +++ b/ext/soap/php_packet_soap.c @@ -345,6 +345,7 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction if (val != NULL) { if (!node_is_equal_ex(val,"result",RPC_SOAP12_NAMESPACE)) { zval *tmp; + zval **arr; tmp = master_to_zval(NULL, val); if (val->name) { @@ -353,10 +354,32 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction zstr u_name; int u_name_len; zend_string_to_unicode_ex(UG(utf8_conv), &u_name.u, &u_name_len, (char*)val->name, strlen((char*)val->name), &status); - add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, tmp); + if (zend_u_hash_find(Z_ARRVAL_P(return_value), IS_UNICODE, u_name, u_name_len+1, (void**)&arr) == SUCCESS) { + add_next_index_zval(*arr, tmp); + } else if (val->next && get_node(val->next, (char*)val->name)) { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmp); + add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, arr); + } else { + add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, tmp); + } efree(u_name.u); } else { - add_assoc_zval(return_value, (char*)val->name, tmp); + if (zend_hash_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name)+1, (void**)&arr) == SUCCESS) { + add_next_index_zval(*arr, tmp); + } else if (val->next && get_node(val->next, (char*)val->name)) { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmp); + add_assoc_zval(return_value, (char*)val->name, arr); + } else { + add_assoc_zval(return_value, (char*)val->name, tmp); + } } } else { add_next_index_zval(return_value, tmp); diff --git a/ext/soap/tests/bugs/bug39121.phpt b/ext/soap/tests/bugs/bug39121.phpt new file mode 100755 index 0000000000..5b3ccbc764 --- /dev/null +++ b/ext/soap/tests/bugs/bug39121.phpt @@ -0,0 +1,73 @@ +--TEST-- +Bug #39121 (Incorrect return array handling in non-wsdl soap client) +--SKIPIF-- + +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + + + + + StateCode + description + + + 241 + Carabobo + + + 243 + Aragua and Carabobo + + + 261 + Zulia + + + + +EOF; + } +} + +$client = new LocalSoapClient(NULL, array('location'=>'test://','uri'=>'test://')); +print_r($client->getDIDAreaResponse()); +?> +--EXPECT-- +Array +( + [Array] => Array + ( + [0] => Array + ( + [0] => StateCode + [1] => description + ) + + [1] => Array + ( + [0] => 241 + [1] => Carabobo + ) + + [2] => Array + ( + [0] => 243 + [1] => Aragua and Carabobo + ) + + [3] => Array + ( + [0] => 261 + [1] => Zulia + ) + + ) + +)