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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+