]> granicus.if.org Git - php/commitdiff
Fixed SIGSEGV
authorDmitry Stogov <dmitry@php.net>
Tue, 1 Nov 2005 11:11:19 +0000 (11:11 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 1 Nov 2005 11:11:19 +0000 (11:11 +0000)
ext/soap/php_encoding.c
ext/soap/tests/any.phpt [new file with mode: 0755]
ext/soap/tests/bugs/bug34449.phpt

index 92c031f471df6932afc55e87571a4977e54a71e3..d17dc6e262f5f63cc14dc3d955adc1384e14ce50 100644 (file)
@@ -2766,7 +2766,7 @@ static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style, xmlNodeP
 
                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;
diff --git a/ext/soap/tests/any.phpt b/ext/soap/tests/any.phpt
new file mode 100755 (executable)
index 0000000..306557b
--- /dev/null
@@ -0,0 +1,83 @@
+--TEST--
+SOAP handling of <any>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class SOAPComplexType {
+    function SOAPComplexType($s, $i, $f) {
+        $this->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)
+    }
+  }
+}
index 95cd4867d8794130a0d7f3ba63f5a952b7fee0da..5aa30bbcac45919d916dbeb04264913742e76a99 100755 (executable)
@@ -1,5 +1,7 @@
 --TEST--
 Bug #34449 (ext/soap: XSD_ANYXML functionality not exposed)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
 --FILE--
 <?php
 class TestSoapClient extends SoapClient {