diff options
| author | Ilia Alshanetsky <iliaa@php.net> | 2003-08-11 03:22:24 +0000 |
|---|---|---|
| committer | Ilia Alshanetsky <iliaa@php.net> | 2003-08-11 03:22:24 +0000 |
| commit | 4320c6994f0f84929141ea2543d95505e465b5d4 (patch) | |
| tree | 464f7af081bb9b5a66574f1b9e4914e0798713fd | |
| parent | da30777de56bb182a407a140776dea6bc740c310 (diff) | |
| download | php-git-4320c6994f0f84929141ea2543d95505e465b5d4.tar.gz | |
Fixed bug #21957 (serialize() mangles objects with __sleep).
| -rw-r--r-- | ext/standard/tests/serialize/bug21957.phpt | 49 | ||||
| -rw-r--r-- | ext/standard/var.c | 5 |
2 files changed, 53 insertions, 1 deletions
diff --git a/ext/standard/tests/serialize/bug21957.phpt b/ext/standard/tests/serialize/bug21957.phpt new file mode 100644 index 0000000000..af2003f3e3 --- /dev/null +++ b/ext/standard/tests/serialize/bug21957.phpt @@ -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 +} diff --git a/ext/standard/var.c b/ext/standard/var.c index 33e73d351e..eac33b05d3 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -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); |
