From: Thies C. Arntzen Date: Wed, 21 Jun 2000 18:22:22 +0000 (+0000) Subject: unserialize() and wddx_deserialize() now create an empty class if they enconter X-Git-Tag: php-4.0.1RC~69 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc8d0782ddd9cd18349a97b89784627f85b61f13;p=php unserialize() and wddx_deserialize() now create an empty class if they enconter 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. --- diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index 850baac254..ee90af462d 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -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 */ diff --git a/ext/standard/var.c b/ext/standard/var.c index 6c32f13d0f..7506890722 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -33,6 +33,30 @@ #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); diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index 01ec184c85..0bd5cfa7c8 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -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 */