]> granicus.if.org Git - php/commitdiff
- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in calling...
authorFelipe Pena <felipe@php.net>
Tue, 24 Nov 2009 11:32:31 +0000 (11:32 +0000)
committerFelipe Pena <felipe@php.net>
Tue, 24 Nov 2009 11:32:31 +0000 (11:32 +0000)
NEWS
ext/xmlrpc/tests/bug50282.phpt [new file with mode: 0644]
ext/xmlrpc/xmlrpc-epi-php.c

diff --git a/NEWS b/NEWS
index 5d2f660143363b8a122b3854c88151e6341ef4a2..c8f18c8970265f77b0c883c251804c1d379831f0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,8 @@ PHP                                                                        NEWS
 
 - Fixed error_log() to be binary safe when using message_type 3. (Jani)
 
+- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in 
+  calling function). (Felipe)
 - Fixed bug #50219 (soap call Segmentation fault on a redirected url).
   (Pierrick)
 - Fixed bug #50207 (segmentation fault when concatenating very large strings
diff --git a/ext/xmlrpc/tests/bug50282.phpt b/ext/xmlrpc/tests/bug50282.phpt
new file mode 100644 (file)
index 0000000..eb35fe3
--- /dev/null
@@ -0,0 +1,43 @@
+--TEST--
+Bug #50282 (xmlrpc_encode_request() changes object into array in calling function)
+--SKIPIF--
+<?php if (!extension_loaded("xmlrpc")) print "skip"; ?>
+--FILE--
+<?php
+
+class One { var $x = 10; }
+
+$o = new One();
+var_dump($o);
+var_dump(xmlrpc_encode_request('test', $o));
+var_dump($o);
+
+?>
+--EXPECTF--
+object(One)#%d (1) {
+  ["x"]=>
+  int(10)
+}
+string(279) "<?xml version="1.0" encoding="iso-8859-1"?>
+<methodCall>
+<methodName>test</methodName>
+<params>
+ <param>
+  <value>
+   <struct>
+    <member>
+     <name>x</name>
+     <value>
+      <int>10</int>
+     </value>
+    </member>
+   </struct>
+  </value>
+ </param>
+</params>
+</methodCall>
+"
+object(One)#%d (1) {
+  ["x"]=>
+  int(10)
+}
index 9f3842c8c5fc2d55f9c795e867f1cd7e8250ecd3..c8272f929bdf0c14c1bc87e7a888d433a7971f01 100644 (file)
@@ -499,6 +499,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
                                        zval** pIter;
                                        char* my_key;
                                        HashTable *ht = NULL;
+                                       zval *val_arr;
 
                                        ht = HASH_OF(val);
                                        if (ht && ht->nApplyCount > 1) {
@@ -506,12 +507,16 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
                                                return NULL;
                                        }
 
-                                       convert_to_array(val);
-                                       xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val)));
+                                       MAKE_STD_ZVAL(val_arr);
+                                       *val_arr = *val;
+                                       zval_copy_ctor(val_arr);
+                                       INIT_PZVAL(val_arr);
+                                       convert_to_array(val_arr);
+                                       xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val_arr)));
 
-                                       zend_hash_internal_pointer_reset(Z_ARRVAL_P(val));
-                                       while(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) {
-                                               int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index);
+                                       zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr));
+                                       while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) {
+                                               int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val_arr), &my_key, &num_index);
                     
                                                switch (res) {
                                                        case HASH_KEY_NON_EXISTANT:
@@ -532,8 +537,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
                                                                }
                                                                break;
                                                }
-                                               zend_hash_move_forward(Z_ARRVAL_P(val));
+                                               zend_hash_move_forward(Z_ARRVAL_P(val_arr));
                                        }
+                                       zval_ptr_dtor(&val_arr);
                                }
                                break;
                        default: