]> granicus.if.org Git - php/commitdiff
Fixed serialization of non string values on __sleep
authorJuan Basso <jrbasso@gmail.com>
Fri, 6 Feb 2015 04:45:04 +0000 (23:45 -0500)
committerStanislav Malyshev <stas@php.net>
Mon, 23 Mar 2015 03:31:40 +0000 (20:31 -0700)
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

ext/standard/tests/serialize/serialization_objects_016.phpt [new file with mode: 0644]
ext/standard/var.c

diff --git a/ext/standard/tests/serialize/serialization_objects_016.phpt b/ext/standard/tests/serialize/serialization_objects_016.phpt
new file mode 100644 (file)
index 0000000..e9b6bf2
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+serialize() integrity with non string on __sleep
+--FILE--
+<?php
+class testString
+{
+       public $a = true;
+
+       public function __sleep()
+       {
+               return array('a', '1');
+       }
+}
+
+class testInteger
+{
+       public $a = true;
+
+       public function __sleep()
+       {
+               return array('a', 1);
+       }
+}
+
+$cs = new testString();
+$ci = new testInteger();
+
+$ss =  @serialize($cs);
+echo $ss . "\n";
+
+$si = @serialize($ci);
+echo $si . "\n";
+
+var_dump(unserialize($ss));
+var_dump(unserialize($si));
+?>
+--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
index 9dd70f5c11059d5992c5baece14075cbb6cc8158..557d71cb372ead03479ed3e4f732eaf169756ab5 100644 (file)
@@ -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) {