]> granicus.if.org Git - php/commitdiff
Fixed bug #72647 (xmlrpc_encode() unexpected output after referencing array elements)
authorXinchen Hui <laruence@gmail.com>
Fri, 22 Jul 2016 15:13:42 +0000 (23:13 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 22 Jul 2016 15:13:42 +0000 (23:13 +0800)
NEWS
ext/xmlrpc/tests/bug72647.phpt [new file with mode: 0644]
ext/xmlrpc/xmlrpc-epi-php.c

diff --git a/NEWS b/NEWS
index f6bfc5d3565f6c63944801846e66f0cc42bbc63c..69bc8f8dfa623505a3aa59bbf4251bbf2ce2719a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -81,6 +81,11 @@ PHP                                                                        NEWS
   . Fixed bug #72330 (CSV fields incorrectly split if escape char followed by
     UTF chars). (cmb)
 
+- XMLRPC:
+  . Fixed bug #72647 (xmlrpc_encode() unexpected output after referencing
+    array elements). (Laruence)
+
+
 - Wddx:
   . Fixed bug #72564 (boolean always deserialized as "true") (Remi)
 
diff --git a/ext/xmlrpc/tests/bug72647.phpt b/ext/xmlrpc/tests/bug72647.phpt
new file mode 100644 (file)
index 0000000..9334cbd
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Bug #72647 (xmlrpc_encode() unexpected output after referencing array elements)
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlrpc")) print "skip";
+?>
+--FILE--
+<?php
+
+$ar = array(4, "a", 7);
+$v = &$ar[1];
+unset($v);
+
+echo xmlrpc_encode($ar);
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+  <array>
+   <data>
+    <value>
+     <int>4</int>
+    </value>
+    <value>
+     <string>a</string>
+    </value>
+    <value>
+     <int>7</int>
+    </value>
+   </data>
+  </array>
+ </value>
+</param>
+</params>
index b5dcee8f0d10be0f7677f06b8fa8a3e0b867ef2a..fa962dd74e34cf5239b42f943040f3dbb691791f 100644 (file)
@@ -568,6 +568,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
                                                xReturn = XMLRPC_CreateVector(key, vtype);
 
                                                ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(val_arr), num_index, my_key, pIter) {
+                                                       ZVAL_DEREF(pIter);
                                                        ht = HASH_OF(pIter);
                                                        if (ht) {
                                                                ht->u.v.nApplyCount++;