From e98a40f1fa055abefe1b9075cf35775605bbcd5c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 1 Nov 2005 11:11:35 +0000 Subject: [PATCH] Fixed SIGSEGV --- ext/soap/php_encoding.c | 5 ++- ext/soap/tests/any.phpt | 83 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100755 ext/soap/tests/any.phpt diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index c0494b8f98..bca17d4a59 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -2760,15 +2760,16 @@ static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style, xmlNodeP if (Z_TYPE_P(data) == IS_STRING) { ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data)); + ret->name = xmlStringTextNoenc; } else { zval tmp = *data; zval_copy_ctor(&tmp); convert_to_string(&tmp); - ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data)); + ret = xmlNewTextLen(Z_STRVAL(tmp), Z_STRLEN(tmp)); zval_dtor(&tmp); + ret->name = xmlStringTextNoenc; } - ret->name = xmlStringTextNoenc; xmlAddChild(parent, ret); return ret; diff --git a/ext/soap/tests/any.phpt b/ext/soap/tests/any.phpt new file mode 100755 index 0000000000..306557b302 --- /dev/null +++ b/ext/soap/tests/any.phpt @@ -0,0 +1,83 @@ +--TEST-- +SOAP handling of +--SKIPIF-- + +--FILE-- +varString = $s; + $this->varInt = $i; + $this->varFloat = $f; + } +} +$struct = new SOAPComplexType('arg',34,325.325); + +function echoAnyElement($x) { + global $g; + + $g = $x; + $struct = $x->inputAny->any; + if ($struct instanceof SOAPComplexType) { + return array("return" => array("any" => new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPComplexType", "http://soapinterop.org/xsd", "SOAPComplexType", "http://soapinterop.org/"))); + } else { + return "?"; + } +} + +class TestSoapClient extends SoapClient { + function __construct($wsdl, $options) { + parent::__construct($wsdl, $options); + $this->server = new SoapServer($wsdl, $options); + $this->server->addFunction('echoAnyElement'); + } + + function __doRequest($request, $location, $action, $version) { + ob_start(); + $this->server->handle($request); + $response = ob_get_contents(); + ob_end_clean(); + return $response; + } +} + +$client = new TestSoapClient(dirname(__FILE__)."/interop/Round4/GroupI/round4_groupI_xsd.wsdl", + array("trace"=>1,"exceptions"=>0, + 'classmap' => array('SOAPComplexType'=>'SOAPComplexType'))); +$ret = $client->echoAnyElement( + array( + "inputAny"=>array( + "any"=>new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPComplexType", "http://soapinterop.org/xsd", "SOAPComplexType", "http://soapinterop.org/") + ))); +var_dump($g); +var_dump($ret); +?> +--EXPECT-- +object(stdClass)#5 (1) { + ["inputAny"]=> + object(stdClass)#6 (1) { + ["any"]=> + object(SOAPComplexType)#7 (3) { + ["varInt"]=> + int(34) + ["varString"]=> + string(3) "arg" + ["varFloat"]=> + float(325.325) + } + } +} +object(stdClass)#8 (1) { + ["return"]=> + object(stdClass)#9 (1) { + ["any"]=> + object(SOAPComplexType)#10 (3) { + ["varInt"]=> + int(34) + ["varString"]=> + string(3) "arg" + ["varFloat"]=> + float(325.325) + } + } +} -- 2.40.0