From c2b8066efb2d661129058790fe4dc1b41de99093 Mon Sep 17 00:00:00 2001 From: Andreas Treichel Date: Sun, 23 Jul 2017 05:29:18 +0200 Subject: [PATCH] Bug #74975: Different serialization for classes --- NEWS | 4 +++ ext/xmlrpc/tests/bug74975.phpt | 56 ++++++++++++++++++++++++++++++++++ ext/xmlrpc/xmlrpc-epi-php.c | 4 +-- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 ext/xmlrpc/tests/bug74975.phpt diff --git a/NEWS b/NEWS index c872c4fff9a..6abb2815dae 100644 --- 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 index 00000000000..8f6a9dfb138 --- /dev/null +++ b/ext/xmlrpc/tests/bug74975.phpt @@ -0,0 +1,56 @@ +--TEST-- +Bug #74975 Different serialization for classes +--SKIPIF-- + +--FILE-- +xmlrpc_type = 'base64'; +$foo->scalar = 'foobar'; + +$bar = new Bar(); +$bar->xmlrpc_type = 'base64'; +$bar->scalar = 'foobar'; + +echo xmlrpc_encode([ + 'foo' => $foo, + 'bar' => $bar +]); + +?> +--EXPECTF-- + + + + + + + foo + + Zm9vYmFy + + + + bar + + Zm9vYmFy + + + + + + diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 47049260535..6b6cf41817d 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -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 {