]> granicus.if.org Git - php/commitdiff
Bug #74975: Different serialization for classes
authorAndreas Treichel <gmblar+github@gmail.com>
Sun, 23 Jul 2017 03:29:18 +0000 (05:29 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 2 Aug 2017 16:49:26 +0000 (18:49 +0200)
NEWS
ext/xmlrpc/tests/bug74975.phpt [new file with mode: 0644]
ext/xmlrpc/xmlrpc-epi-php.c

diff --git a/NEWS b/NEWS
index c872c4fff9a66c2414d6646ec4df499375be34fc..6abb2815dae03b9f8727d225ac07f405c487097f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,10 @@ PHP                                                                        NEWS
   . Fixed bug #74669 (Unserialize ArrayIterator broken). (Andrew Nester)
   . Fixed bug #75015 (Crash in recursive iterator destructors). (Julien)
 
+- XMLRPC:
+  . Fixed bug #74975 (Incorrect xmlrpc serialization for classes with declared
+    properties). (blar)
+
 03 Aug 2017 PHP 7.0.22
 
 - Core:
diff --git a/ext/xmlrpc/tests/bug74975.phpt b/ext/xmlrpc/tests/bug74975.phpt
new file mode 100644 (file)
index 0000000..8f6a9df
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+Bug #74975     Different serialization for classes
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlrpc")) print "skip";
+?>
+--FILE--
+<?php
+
+class Foo {
+    
+}
+
+class Bar {
+    
+    public $xmlrpc_type;
+    public $scalar;
+    
+}
+
+$foo = new Foo();
+$foo->xmlrpc_type = 'base64';
+$foo->scalar = 'foobar';
+
+$bar = new Bar();
+$bar->xmlrpc_type = 'base64';
+$bar->scalar = 'foobar';
+
+echo xmlrpc_encode([
+    'foo' => $foo,
+    'bar' => $bar
+]);
+
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+  <struct>
+   <member>
+    <name>foo</name>
+    <value>
+     <base64>Zm9vYmFy&#10;</base64>
+    </value>
+   </member>
+   <member>
+    <name>bar</name>
+    <value>
+     <base64>Zm9vYmFy&#10;</base64>
+    </value>
+   </member>
+  </struct>
+ </value>
+</param>
+</params>
index 47049260535d5f429645ffaed8b54e1fb4e1e236..6b6cf41817d49592e4f30f6faa3b8430cea75859 100644 (file)
@@ -1354,7 +1354,7 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval* newvalue) /* {{{ */
                                        zval* attr;
                                        type = xmlrpc_vector;
 
-                                       if ((attr = zend_hash_str_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1)) != NULL) {
+                                       if ((attr = zend_hash_str_find_ind(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1)) != NULL) {
                                                if (Z_TYPE_P(attr) == IS_STRING) {
                                                        type = xmlrpc_str_as_type(Z_STRVAL_P(attr));
                                                }
@@ -1368,7 +1368,7 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval* newvalue) /* {{{ */
                        zval* val;
 
                        if ((type == xmlrpc_base64 && Z_TYPE_P(value) == IS_OBJECT) || type == xmlrpc_datetime) {
-                               if ((val = zend_hash_str_find(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR) - 1)) != NULL) {
+                               if ((val = zend_hash_str_find_ind(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR) - 1)) != NULL) {
                                        ZVAL_COPY_VALUE(newvalue, val);
                                }
                        } else {