dmitry Thu Mar 18 11:54:37 2004 EDT Added files: /php-src/ext/standard/tests/serialize bug27469.phpt
Modified files: /php-src/ext/standard incomplete_class.c php_incomplete_class.h var.c Log: BUG #27469 was fixed (serialize() objects of incomplete class) http://cvs.php.net/diff.php/php-src/ext/standard/incomplete_class.c?r1=1.21&r2=1.22&ty=u Index: php-src/ext/standard/incomplete_class.c diff -u php-src/ext/standard/incomplete_class.c:1.21 php-src/ext/standard/incomplete_class.c:1.22 --- php-src/ext/standard/incomplete_class.c:1.21 Thu Jan 8 03:17:32 2004 +++ php-src/ext/standard/incomplete_class.c Thu Mar 18 11:54:36 2004 @@ -17,7 +17,7 @@ */ -/* $Id: incomplete_class.c,v 1.21 2004/01/08 08:17:32 andi Exp $ */ +/* $Id: incomplete_class.c,v 1.22 2004/03/18 16:54:36 dmitry Exp $ */ #include "php.h" #include "basic_functions.h" @@ -39,7 +39,7 @@ char *class_name = NULL; if(EG(This)) { - class_name = php_lookup_class_name(EG(This), NULL, 0); + class_name = php_lookup_class_name(EG(This), NULL); } if (!class_name) @@ -114,7 +114,7 @@ /* {{{ php_lookup_class_name */ -char *php_lookup_class_name(zval *object, size_t *nlen, zend_bool del) +char *php_lookup_class_name(zval *object, size_t *nlen) { zval **val; char *retval = NULL; @@ -128,9 +128,6 @@ if (nlen) *nlen = Z_STRLEN_PP(val); - - if (del) - zend_hash_del(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER)); } return (retval); http://cvs.php.net/diff.php/php-src/ext/standard/php_incomplete_class.h?r1=1.12&r2=1.13&ty=u Index: php-src/ext/standard/php_incomplete_class.h diff -u php-src/ext/standard/php_incomplete_class.h:1.12 php-src/ext/standard/php_incomplete_class.h:1.13 --- php-src/ext/standard/php_incomplete_class.h:1.12 Thu Jan 8 12:32:51 2004 +++ php-src/ext/standard/php_incomplete_class.h Thu Mar 18 11:54:36 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_incomplete_class.h,v 1.12 2004/01/08 17:32:51 sniper Exp $ */ +/* $Id: php_incomplete_class.h,v 1.13 2004/03/18 16:54:36 dmitry Exp $ */ #ifndef PHP_INCOMPLETE_CLASS_H #define PHP_INCOMPLETE_CLASS_H @@ -29,8 +29,9 @@ #define PHP_SET_CLASS_ATTRIBUTES(struc) \ /* OBJECTS_FIXME: Fix for new object model */ \ if (Z_OBJCE_P(struc) == BG(incomplete_class)) { \ - class_name = php_lookup_class_name(struc, &name_len, 1); \ + class_name = php_lookup_class_name(struc, &name_len); \ free_class_name = 1; \ + incomplete_class = 1; \ } else { \ class_name = Z_OBJCE_P(struc)->name; \ name_len = Z_OBJCE_P(struc)->name_length; \ @@ -42,7 +43,8 @@ #define PHP_CLASS_ATTRIBUTES \ char *class_name; \ size_t name_len; \ - zend_bool free_class_name = 0 \ + zend_bool free_class_name = 0; \ + zend_bool incomplete_class = 0 #define INCOMPLETE_CLASS "__PHP_Incomplete_Class" #define MAGIC_MEMBER "__PHP_Incomplete_Class_Name" @@ -53,7 +55,7 @@ zend_class_entry *php_create_incomplete_class(TSRMLS_D); -char *php_lookup_class_name(zval *object, size_t *nlen, zend_bool del); +char *php_lookup_class_name(zval *object, size_t *nlen); void php_store_class_name(zval *object, const char *name, size_t len); #ifdef __cplusplus http://cvs.php.net/diff.php/php-src/ext/standard/var.c?r1=1.186&r2=1.187&ty=u Index: php-src/ext/standard/var.c diff -u php-src/ext/standard/var.c:1.186 php-src/ext/standard/var.c:1.187 --- php-src/ext/standard/var.c:1.186 Mon Mar 8 18:11:43 2004 +++ php-src/ext/standard/var.c Thu Mar 18 11:54:36 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var.c,v 1.186 2004/03/08 23:11:43 abies Exp $ */ +/* $Id: var.c,v 1.187 2004/03/18 16:54:36 dmitry Exp $ */ /* {{{ includes @@ -468,7 +468,7 @@ smart_str_appendl(buf, "\";", 2); } -static inline void php_var_serialize_class_name(smart_str *buf, zval **struc TSRMLS_DC) +static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval **struc TSRMLS_DC) { PHP_CLASS_ATTRIBUTES; @@ -479,16 +479,21 @@ smart_str_appendl(buf, class_name, name_len); smart_str_appendl(buf, "\":", 2); PHP_CLEANUP_CLASS_ATTRIBUTES(); + return incomplete_class; } static void php_var_serialize_class(smart_str *buf, zval **struc, zval *retval_ptr, HashTable *var_hash TSRMLS_DC) { int count; + zend_bool incomplete_class; - php_var_serialize_class_name(buf, struc TSRMLS_CC); + incomplete_class = php_var_serialize_class_name(buf, struc TSRMLS_CC); /* count after serializing name, since php_var_serialize_class_name changes the count if the variable is incomplete class */ count = zend_hash_num_elements(HASH_OF(retval_ptr)); + if (incomplete_class) { + --count; + } smart_str_append_long(buf, count); smart_str_appendl(buf, ":{", 2); @@ -512,6 +517,9 @@ if (i == HASH_KEY_NON_EXISTANT) break; + if (incomplete_class && strcmp(key, MAGIC_MEMBER) == 0) { + continue; + } zend_hash_get_current_data_ex(HASH_OF(retval_ptr), (void **) &name, &pos); @@ -624,17 +632,21 @@ zval_ptr_dtor(&retval_ptr); /* fall-through */ } - case IS_ARRAY: + case IS_ARRAY: { + zend_bool incomplete_class = 0; if (Z_TYPE_PP(struc) == IS_ARRAY) { smart_str_appendl(buf, "a:", 2); myht = HASH_OF(*struc); } else { - php_var_serialize_class_name(buf, struc TSRMLS_CC); + incomplete_class = php_var_serialize_class_name(buf, struc TSRMLS_CC); myht = Z_OBJPROP_PP(struc); } /* count after serializing name, since php_var_serialize_class_name changes the count if the variable is incomplete class */ i = myht ? zend_hash_num_elements(myht) : 0; + if (i > 0 && incomplete_class) { + --i; + } smart_str_append_long(buf, i); smart_str_appendl(buf, ":{", 2); if (i > 0) { @@ -651,6 +663,10 @@ if (i == HASH_KEY_NON_EXISTANT) break; + if (incomplete_class && strcmp(key, MAGIC_MEMBER) == 0) { + continue; + } + switch (i) { case HASH_KEY_IS_LONG: php_var_serialize_long(buf, index); @@ -674,6 +690,7 @@ } smart_str_appendc(buf, '}'); return; + } default: smart_str_appendl(buf, "i:0;", 4); return; http://cvs.php.net/co.php/php-src/ext/standard/tests/serialize/bug27469.phpt?r=1.1&p=1 Index: php-src/ext/standard/tests/serialize/bug27469.phpt +++ php-src/ext/standard/tests/serialize/bug27469.phpt --TEST-- Bug #27469 (serialize() objects of incomplete class) --FILE-- <?php $str = 'O:9:"TestClass":0:{}'; $obj = unserialize($str); var_dump($obj); echo serialize($obj)."\n"; var_dump($obj); echo serialize($obj)."\n"; var_dump($obj); ?> --EXPECT-- object(__PHP_Incomplete_Class)#1 (1) { ["__PHP_Incomplete_Class_Name"]=> string(9) "TestClass" } O:9:"TestClass":0:{} object(__PHP_Incomplete_Class)#1 (1) { ["__PHP_Incomplete_Class_Name"]=> string(9) "TestClass" } O:9:"TestClass":0:{} object(__PHP_Incomplete_Class)#1 (1) { ["__PHP_Incomplete_Class_Name"]=> string(9) "TestClass" } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php