]> granicus.if.org Git - php/commitdiff
fix segfault and leak in ext/xmlrpc
authorAntony Dovgal <tony2001@php.net>
Mon, 14 Aug 2006 08:18:01 +0000 (08:18 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 14 Aug 2006 08:18:01 +0000 (08:18 +0000)
add tests

ext/xmlrpc/tests/001.phpt [new file with mode: 0644]
ext/xmlrpc/tests/002.phpt [new file with mode: 0644]
ext/xmlrpc/xmlrpc-epi-php.c

diff --git a/ext/xmlrpc/tests/001.phpt b/ext/xmlrpc/tests/001.phpt
new file mode 100644 (file)
index 0000000..99fd958
--- /dev/null
@@ -0,0 +1,66 @@
+--TEST--
+xmlrpc_encode_request() with wrong arguments
+--SKIPIF--
+<?php if (!extension_loaded("xmlrpc")) print "skip"; ?>
+--FILE--
+<?php
+
+var_dump(xmlrpc_encode_request(-1, 1));
+var_dump(xmlrpc_encode_request("", 1));
+var_dump(xmlrpc_encode_request(array(), 1));
+var_dump(xmlrpc_encode_request(3.4, 1));
+
+echo "Done\n";
+?>
+--EXPECTF--    
+string(174) "<?xml version="1.0" encoding="iso-8859-1"?>
+<methodCall>
+<methodName>-1</methodName>
+<params>
+ <param>
+  <value>
+   <int>1</int>
+  </value>
+ </param>
+</params>
+</methodCall>
+"
+string(160) "<?xml version="1.0" encoding="iso-8859-1"?>
+<methodCall>
+<methodName/>
+<params>
+ <param>
+  <value>
+   <int>1</int>
+  </value>
+ </param>
+</params>
+</methodCall>
+"
+
+Notice: Array to string conversion in %s on line %d
+string(177) "<?xml version="1.0" encoding="iso-8859-1"?>
+<methodCall>
+<methodName>Array</methodName>
+<params>
+ <param>
+  <value>
+   <int>1</int>
+  </value>
+ </param>
+</params>
+</methodCall>
+"
+string(175) "<?xml version="1.0" encoding="iso-8859-1"?>
+<methodCall>
+<methodName>3.4</methodName>
+<params>
+ <param>
+  <value>
+   <int>1</int>
+  </value>
+ </param>
+</params>
+</methodCall>
+"
+Done
diff --git a/ext/xmlrpc/tests/002.phpt b/ext/xmlrpc/tests/002.phpt
new file mode 100644 (file)
index 0000000..c8d722b
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+xmlrpc_encode_request() and various arguments
+--SKIPIF--
+<?php if (!extension_loaded("xmlrpc")) print "skip"; ?>
+--FILE--
+<?php
+
+$r = xmlrpc_encode_request("method", array());
+var_dump(xmlrpc_decode_request($r, $method));
+var_dump($method);
+
+$r = xmlrpc_encode_request("method", 1);
+var_dump(xmlrpc_decode_request($r, $method));
+var_dump($method);
+
+$r = xmlrpc_encode_request("method", 'param');
+var_dump(xmlrpc_decode_request($r, $method));
+var_dump($method);
+
+$r = xmlrpc_encode_request(-1, "");
+var_dump(xmlrpc_decode_request($r, $method));
+var_dump($method);
+
+$r = xmlrpc_encode_request(array(), 1);
+var_dump(xmlrpc_decode_request($r, $method));
+var_dump($method);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+array(0) {
+}
+string(6) "method"
+array(1) {
+  [0]=>
+  int(1)
+}
+string(6) "method"
+array(1) {
+  [0]=>
+  string(5) "param"
+}
+string(6) "method"
+array(1) {
+  [0]=>
+  string(0) ""
+}
+string(2) "-1"
+
+Notice: Array to string conversion in %s on line %d
+array(1) {
+  [0]=>
+  int(1)
+}
+string(5) "Array"
+Done
index 69fe7534e9f93ef77b674cd5e4371f9edf085f3a..0ed30b79a1c0fed37dc9c68c79eb37b65b0a3c7d 100644 (file)
@@ -671,6 +671,7 @@ PHP_FUNCTION(xmlrpc_encode_request)
                        if (Z_TYPE_PP(method) == IS_NULL) {
                                XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_response);
                        } else {
+                               convert_to_string_ex(method);
                                XMLRPC_RequestSetMethodName(xRequest, Z_STRVAL_PP(method));
                                XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_call);
                        }
@@ -740,7 +741,7 @@ zval* decode_request_worker (zval* xml_in, zval* encoding_in, zval* method_name_
 
       if(XMLRPC_RequestGetRequestType(response) == xmlrpc_request_call) {
          if(method_name_out) {
-            convert_to_string(method_name_out);
+            zval_dtor(method_name_out);
             Z_TYPE_P(method_name_out) = IS_STRING;
             Z_STRVAL_P(method_name_out) = estrdup(XMLRPC_RequestGetMethodName(response));
             Z_STRLEN_P(method_name_out) = strlen(Z_STRVAL_P(method_name_out));