diff options
author | Stanislav Malyshev <stas@php.net> | 2005-02-23 11:17:52 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2005-02-23 11:17:52 +0000 |
commit | db3fdce304a9ba026f355fb3d03e9d2eb45cda5d (patch) | |
tree | 5d305df1568513c07c66296bffce1c13fc9358c3 /ext/standard/var_unserializer.re | |
parent | 5b98a092195a7977fa3f4ab0d6d8918654d50ff9 (diff) | |
download | php-git-db3fdce304a9ba026f355fb3d03e9d2eb45cda5d.tar.gz |
Custom object serializer infrastructure - PHP implementation
# The detailed announce on the list will follow
Diffstat (limited to 'ext/standard/var_unserializer.re')
-rw-r--r-- | ext/standard/var_unserializer.re | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index bc2a477df3..d175731786 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -151,6 +151,7 @@ iv = [+-]? [0-9]+; nv = [+-]? ([0-9]* "." [0-9]+|[0-9]+ "." [0-9]*); nvexp = (iv | nv) [eE] [+-]? iv; any = [\000-\277]; +object = [OC]; */ @@ -280,6 +281,33 @@ static inline int finish_nested_data(UNSERIALIZE_PARAMETER) return 0; } +static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce) +{ + int datalen; + + if(ce->unserialize == NULL) { + zend_error(E_WARNING, "Class %s has no unserializer", ce->name); + return 0; + } + + datalen = parse_iv2((*p) + 2, p); + + (*p) += 2; + + if((*p) + datalen >= max) { + zend_error(E_WARNING, "Unsifficient data for unserializing - %d required, %d present", datalen, max - (*p)); + return 0; + } + + if(ce->unserialize(rval, *p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) { + return 0; + } + + (*p) += datalen; + + return finish_nested_data(UNSERIALIZE_PASSTHRU); +} + static inline int object_common1(UNSERIALIZE_PARAMETER, zend_class_entry *ce) { int elements; @@ -472,18 +500,24 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -"O:" uiv ":" ["] { +object ":" uiv ":" ["] { size_t len, len2, len3, maxlen; int elements; char *class_name; zend_class_entry *ce; zend_class_entry **pce; int incomplete_class = 0; - + + int custom_object = 0; + zval *user_func; zval *retval_ptr; zval **args[1]; zval *arg_func_name; + + if(*start == 'C') { + custom_object = 1; + } INIT_PZVAL(*rval); len2 = len = parse_uiv(start + 2); @@ -560,8 +594,14 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) zval_ptr_dtor(&arg_func_name); break; } while (1); - + *p = YYCURSOR; + + if(custom_object) { + efree(class_name); + return object_custom(UNSERIALIZE_PASSTHRU, ce); + } + elements = object_common1(UNSERIALIZE_PASSTHRU, ce); if (incomplete_class) { |