diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 84c4aabd39c..712d8bb1ea5 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1103,13 +1103,14 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr if (node) { zval *val; + xmlNodePtr r_node; - node = check_and_resolve_href(node); - if (node && node->children && node->children->content) { - if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)node->children->content) != 0) { - soap_error3(E_ERROR, "Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)", model->u.element->name, model->u.element->fixed, node->children->content); + r_node = check_and_resolve_href(node); + if (r_node && r_node->children && r_node->children->content) { + if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)r_node->children->content) != 0) { + soap_error3(E_ERROR, "Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)", model->u.element->name, model->u.element->fixed, r_node->children->content); } - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } else if (model->u.element->fixed) { xmlNodePtr dummy = xmlNewNode(NULL, BAD_CAST("BOGUS")); xmlNodeSetContent(dummy, BAD_CAST(model->u.element->fixed)); @@ -1121,7 +1122,7 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr val = master_to_zval(model->u.element->encode, dummy); xmlFreeNode(dummy); } else { - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } if ((node = get_node(node->next, model->u.element->name)) != NULL) { zval *array; diff --git a/ext/soap/tests/bugs/bug38536.phpt b/ext/soap/tests/bugs/bug38536.phpt new file mode 100755 index 00000000000..1dd84d601ed --- /dev/null +++ b/ext/soap/tests/bugs/bug38536.phpt @@ -0,0 +1,52 @@ +--TEST-- +Bug #38536 (SOAP returns an array of values instead of an object) +--SKIPIF-- + +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + + + + + 2 +
+ + + + 2 +
+ +
Test
+ + +EOF; + } +} + +ini_set("soap.wsdl_cache_enabled", 0); +$SOAPObject = new LocalSoapClient(dirname(__FILE__).'/bug38536.wsdl'); +print_r($SOAPObject->test()); +?> +--EXPECT-- +stdClass Object +( + [id] => 2 + [address] => stdClass Object + ( + [idClient] => 2 + [address] => Test + ) + +) diff --git a/ext/soap/tests/bugs/bug38536.wsdl b/ext/soap/tests/bugs/bug38536.wsdl new file mode 100755 index 00000000000..0ef3fd43cd3 --- /dev/null +++ b/ext/soap/tests/bugs/bug38536.wsdl @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +