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