cvs: php4 /ext/standard var.c /ext/standard/tests/serialize 002.phpt
| From: | Thies C. Arntzen | Date: | Sat, 01 Dec 2001 15:06:37 +0000 |
| Subject: | cvs: php4 /ext/standard var.c /ext/standard/tests/serialize 002.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-8347@lists.php.net to get a copy of this message | ||
thies Sat Dec 1 10:06:37 2001 EDT
Added files:
/php4/ext/standard/tests/serialize 002.phpt
Modified files:
/php4/ext/standard var.c
Log:
serialized data would be incoorect if __sleep() returned a variable-name
which is non-existant in the object.
submitted by: Bernd Roemer <berndr@bonn.edu>
Index: php4/ext/standard/var.c
diff -u php4/ext/standard/var.c:1.118 php4/ext/standard/var.c:1.119
--- php4/ext/standard/var.c:1.118 Sat Nov 10 16:18:34 2001
+++ php4/ext/standard/var.c Sat Dec 1 10:06:37 2001
@@ -199,25 +199,24 @@
php_var_serialize_class_name(buf, struc TSRMLS_CC);
- smart_str_append_long(buf, count);
- smart_str_appendl(buf, ":{", 2);
-
if (count > 0) {
char *key;
zval **d, **name;
ulong index;
HashPosition pos;
int i;
-
- zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos);
+ int cundef;
+ smart_str buf2={0};
+ cundef=0;
+ zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos);
for (;; zend_hash_move_forward_ex(HASH_OF(retval_ptr), &pos)) {
i = zend_hash_get_current_key_ex(HASH_OF(retval_ptr), &key, NULL,
&index, 0, &pos);
if (i == HASH_KEY_NON_EXISTANT)
break;
-
+
zend_hash_get_current_data_ex(HASH_OF(retval_ptr),
(void **) &name, &pos);
@@ -230,12 +229,20 @@
if (zend_hash_find(Z_OBJPROP_PP(struc), Z_STRVAL_PP(name),
Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) {
- php_var_serialize_string(buf, Z_STRVAL_PP(name),
+ php_var_serialize_string(&buf2, Z_STRVAL_PP(name),
Z_STRLEN_PP(name));
- php_var_serialize_intern(buf, d, var_hash TSRMLS_CC);
+ php_var_serialize_intern(&buf2, d, var_hash TSRMLS_CC);
+ } else {
+ cundef++;
}
}
+ smart_str_append_long(buf, count-cundef);
+ smart_str_appendl(buf, ":{", 2);
+ smart_str_appendl(buf,buf2.c,buf2.len);
+ smart_str_free(&buf2);
}
+
+
smart_str_appendc(buf, '}');
}
Index: php4/ext/standard/tests/serialize/002.phpt
+++ php4/ext/standard/tests/serialize/002.phpt
--TEST--
serialize() (Bug #14293)
--POST--
--GET--
--FILE--
<?php
class t
{
function t()
{
$this->a = 'hello';
}
function __sleep()
{
echo "__sleep called\n";
return array('a','b');
}
}
$t = new t();
$data = serialize($t);
echo "$data\n";
$t = unserialize($data);
var_dump($t);
?>
--EXPECT--
__sleep called
O:1:"t":1:{s:1:"a";s:5:"hello";}
object(t)(1) {
["a"]=>
string(5) "hello"
}