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

Reply via email to