]> granicus.if.org Git - php/commitdiff
Fixed bug #21957 (serialize() mangles objects with __sleep).
authorIlia Alshanetsky <iliaa@php.net>
Mon, 11 Aug 2003 03:22:24 +0000 (03:22 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 11 Aug 2003 03:22:24 +0000 (03:22 +0000)
ext/standard/tests/serialize/bug21957.phpt [new file with mode: 0644]
ext/standard/var.c

diff --git a/ext/standard/tests/serialize/bug21957.phpt b/ext/standard/tests/serialize/bug21957.phpt
new file mode 100644 (file)
index 0000000..af2003f
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Bug #21957 (serialize() mangles objects with __sleep)
+--FILE--
+<?php 
+class test
+{
+       var $a, $b;
+
+       function test()
+       {
+               $this->a = 7;
+               $this->b = 2;
+       }
+
+       function __sleep()
+       {
+               $this->b = 0;
+       }
+}
+
+$t['one'] = 'ABC';
+$t['two'] = new test();
+
+var_dump($t);
+
+$s =  @serialize($t);
+echo $s . "\n";
+
+var_dump(unserialize($s));
+?>
+--EXPECT--
+array(2) {
+  ["one"]=>
+  string(3) "ABC"
+  ["two"]=>
+  object(test)#1 (2) {
+    ["a"]=>
+    int(7)
+    ["b"]=>
+    int(2)
+  }
+}
+a:2:{s:3:"one";s:3:"ABC";s:3:"two";N;}
+array(2) {
+  ["one"]=>
+  string(3) "ABC"
+  ["two"]=>
+  NULL
+}
index 33e73d351e2b55a7be732e89e9f956d99aefaa6d..eac33b05d3872ebd525de55112ab818bdc4317ed 100644 (file)
@@ -483,7 +483,7 @@ static void php_var_serialize_class(smart_str *buf, zval **struc, zval *retval_p
                                                "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,"s:0:\"\";N;", 9);
+                               smart_str_appendl(buf,"N;", 2);
                                continue;
                        }
 
@@ -565,6 +565,9 @@ static void php_var_serialize_intern(smart_str *buf, zval **struc, HashTable *va
                                                                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);
                                                        }
                                                        
                                                        zval_ptr_dtor(&retval_ptr);