From 4076a4d2a9b004c5898ea60b549f824631e0983d Mon Sep 17 00:00:00 2001 From: Juan Basso Date: Thu, 5 Feb 2015 23:45:04 -0500 Subject: [PATCH] Fixed serialization of non string values on __sleep Returning just N; (null) on the __sleep makes the number of fields/values be incomplete and corrupting the generated value from serialize, making impossible to unserialize it. Conflicts: ext/standard/var.c --- .../serialize/serialization_objects_016.phpt | 51 +++++++++++++++++++ ext/standard/var.c | 5 +- 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 ext/standard/tests/serialize/serialization_objects_016.phpt diff --git a/ext/standard/tests/serialize/serialization_objects_016.phpt b/ext/standard/tests/serialize/serialization_objects_016.phpt new file mode 100644 index 0000000000..e9b6bf21da --- /dev/null +++ b/ext/standard/tests/serialize/serialization_objects_016.phpt @@ -0,0 +1,51 @@ +--TEST-- +serialize() integrity with non string on __sleep +--FILE-- + +--EXPECT-- +O:10:"testString":2:{s:1:"a";b:1;s:1:"1";N;} +O:11:"testInteger":2:{s:1:"a";b:1;s:1:"1";N;} +object(testString)#3 (2) { + ["a"]=> + bool(true) + ["1"]=> + NULL +} +object(testInteger)#3 (2) { + ["a"]=> + bool(true) + ["1"]=> + NULL +} \ No newline at end of file diff --git a/ext/standard/var.c b/ext/standard/var.c index 9dd70f5c11..557d71cb37 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -658,10 +658,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt if (Z_TYPE_PP(name) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "__sleep should return an array only containing the names of instance-variables to serialize."); - /* we should still add element even if it's not OK, - * since we already wrote the length of the array before */ - smart_str_appendl(buf,"N;", 2); - continue; + convert_to_string(name); } propers = Z_OBJPROP_P(struc); if (zend_hash_find(propers, Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) { -- 2.50.1