]> granicus.if.org Git - php/commitdiff
unserialize() and wddx_deserialize() now create an empty class if they enconter
authorThies C. Arntzen <thies@php.net>
Wed, 21 Jun 2000 18:22:22 +0000 (18:22 +0000)
committerThies C. Arntzen <thies@php.net>
Wed, 21 Jun 2000 18:22:22 +0000 (18:22 +0000)
a class which's code is yet unknown. this makes sessionized data retain the
class name of objects even if you visited pages that don't have the classes
code available.

ext/standard/php_var.h
ext/standard/var.c
ext/wddx/wddx.c

index 850baac2547d02559c2e32e9874ef0c788aaf69e..ee90af462d1970ee442b612e215a4f2bb2d164bd 100644 (file)
@@ -39,4 +39,6 @@ void php_var_dump(pval **struc, int level);
 void php_var_serialize(pval *buf, pval **struc);
 int php_var_unserialize(pval **rval, const char **p, const char *max);
 
+PHPAPI zend_class_entry *php_create_empty_class(char *class_name,int len);
+
 #endif /* _PHPVAR_H */
index 6c32f13d0fc1e8632255de715427fb306ab5471e..7506890722f255713ed152b0f928c608bec66801 100644 (file)
 #define COMMON ((*struc)->is_ref?"&":"")
 
 /* }}} */
+
+PHPAPI zend_class_entry *php_create_empty_class(char *class_name,int len)
+{ 
+       zend_class_entry nclass,*nclassp;
+
+       CLS_FETCH();
+
+       memset(&nclass,0,sizeof(zend_class_entry));
+
+       nclass.name = estrdup(class_name);
+       nclass.name_length = len;
+       nclass.type = ZEND_USER_CLASS;
+       nclass.refcount = (int *) emalloc(sizeof(int));
+       *nclass.refcount = 1;
+       nclass.constants_updated = 0;
+
+       zend_hash_init(&nclass.function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0);
+       zend_hash_init(&nclass.default_properties, 10, NULL, ZVAL_PTR_DTOR, 0);
+
+       zend_hash_update(CG(class_table), nclass.name, nclass.name_length + 1, &nclass, sizeof(zend_class_entry), (void **) &nclassp);
+
+       return nclassp;
+}
+
 /* {{{ php_var_dump */
 
 static int php_array_element_dump(zval **zv, int num_args, va_list args, zend_hash_key *hash_key)
@@ -451,8 +475,11 @@ int php_var_unserialize(pval **rval, const char **p, const char *max)
                                        (*p) += i;
                                        
                                        if (zend_hash_find(EG(class_table), class_name, i+1, (void **) &ce)==FAILURE) {
+                                               ce = php_create_empty_class(class_name,i);
+                                               /*
                                                php_error(E_NOTICE, "Unserializing non-existant class: %s! No methods will be available!", class_name);
                                                ce = &zend_standard_class_def;
+                                               */
                                        }
 
                                        efree(class_name);
index 01ec184c85cfbbc53289740f93196830aa6f4146..0bd5cfa7c8107c8d5e9b4210668d6548dedb831d 100644 (file)
@@ -34,6 +34,8 @@
 
 #if HAVE_WDDX
 
+#include "ext/standard/php_var.h" /* for php_create_empty_class */
+
 #include "php_wddx_api.h"
 #define PHP_XML_INTERNAL
 #include "ext/xml/php_xml.h"
@@ -739,8 +741,13 @@ static void php_wddx_pop_element(void *user_data, const char *name)
 
                                                if (zend_hash_find(EG(class_table), ent1->data->value.str.val,
                                                                                   ent1->data->value.str.len+1, (void **) &ce)==FAILURE) {
+
+                                                       ce = php_create_empty_class(ent1->data->value.str.val,ent1->data->value.str.len);
+
+                                                       /*
                                                        php_error(E_NOTICE, "Deserializing non-existant class: %s! No methods will be available!", ent1->data->value.str.val);
                                                        ce = &zend_standard_class_def;
+                                                       */
                                                }
 
                                                /* Initialize target object */