Property changes on: ext ___________________________________________________________________ Added: svn:ignore + http Index: ext/spl/spl_array.c =================================================================== --- ext/spl/spl_array.c (revision 299276) +++ ext/spl/spl_array.c (working copy) @@ -59,23 +59,19 @@ #define SPL_ARRAY_CLONE_MASK 0x0300FFFF typedef struct _spl_array_object { - zend_object std; - zval *array; - zval *retval; - HashPosition pos; - ulong pos_h; - int ar_flags; - int is_self; - zend_function *fptr_offset_get; - zend_function *fptr_offset_set; - zend_function *fptr_offset_has; - zend_function *fptr_offset_del; - zend_function *fptr_count; - zend_function *fptr_serialize; - zend_function *fptr_unserialize; - zend_class_entry *ce_get_iterator; - php_serialize_data_t *serialize_data; - php_unserialize_data_t *unserialize_data; + zend_object std; + zval *array; + zval *retval; + HashPosition pos; + ulong pos_h; + int ar_flags; + int is_self; + zend_function *fptr_offset_get; + zend_function *fptr_offset_set; + zend_function *fptr_offset_has; + zend_function *fptr_offset_del; + zend_function *fptr_count; + zend_class_entry* ce_get_iterator; HashTable *debug_info; } spl_array_object; @@ -155,8 +151,6 @@ /* }}} */ zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC); -int spl_array_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); -int spl_array_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); /* {{{ spl_array_object_new_ex */ static zend_object_value spl_array_object_new_ex(zend_class_entry *class_type, spl_array_object **obj, zval *orig, int clone_orig TSRMLS_DC) @@ -176,8 +170,6 @@ zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); intern->ar_flags = 0; - intern->serialize_data = NULL; - intern->unserialize_data = NULL; intern->debug_info = NULL; intern->ce_get_iterator = spl_ce_ArrayIterator; if (orig) { @@ -244,14 +236,6 @@ if (intern->fptr_count->common.scope == parent) { intern->fptr_count = NULL; } - zend_hash_find(&class_type->function_table, "serialize", sizeof("serialize"), (void **) &intern->fptr_serialize); - if (intern->fptr_serialize->common.scope == parent) { - intern->fptr_serialize = NULL; - } - zend_hash_find(&class_type->function_table, "unserialize", sizeof("unserialize"), (void **) &intern->fptr_unserialize); - if (intern->fptr_unserialize->common.scope == parent) { - intern->fptr_unserialize = NULL; - } } /* Cache iterator functions if ArrayIterator or derived. Check current's */ /* cache since only current is always required */ @@ -1517,27 +1501,31 @@ } /* }}} */ -smart_str spl_array_serialize_helper(spl_array_object *intern, php_serialize_data_t *var_hash_p TSRMLS_DC) { /* {{{ */ +/* {{{ proto string ArrayObject::serialize() + Serialize the object */ +SPL_METHOD(Array, serialize) +{ + zval *object = getThis(); + spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC); zval members, *pmembers; + php_serialize_data_t var_hash; smart_str buf = {0}; - zval *flags; if (!aht) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array"); - return buf; + return; } - MAKE_STD_ZVAL(flags); - ZVAL_LONG(flags, (intern->ar_flags & SPL_ARRAY_CLONE_MASK)); + PHP_VAR_SERIALIZE_INIT(var_hash); /* storage */ - smart_str_appendl(&buf, "x:", 2); - php_var_serialize(&buf, &flags, var_hash_p TSRMLS_CC); - zval_ptr_dtor(&flags); + smart_str_appendl(&buf, "x:i:", 4); + smart_str_append_long(&buf, (intern->ar_flags & SPL_ARRAY_CLONE_MASK)); + smart_str_appendc(&buf, ';'); if (!(intern->ar_flags & SPL_ARRAY_IS_SELF)) { - php_var_serialize(&buf, &intern->array, var_hash_p TSRMLS_CC); + php_var_serialize(&buf, &intern->array, &var_hash TSRMLS_CC); smart_str_appendc(&buf, ';'); } @@ -1547,35 +1535,11 @@ Z_ARRVAL(members) = intern->std.properties; Z_TYPE(members) = IS_ARRAY; pmembers = &members; - php_var_serialize(&buf, &pmembers, var_hash_p TSRMLS_CC); /* finishes the string */ + php_var_serialize(&buf, &pmembers, &var_hash TSRMLS_CC); /* finishes the string */ /* done */ - return buf; -} -/* }}} */ + PHP_VAR_SERIALIZE_DESTROY(var_hash); -/* {{{ proto string ArrayObject::serialize() - Serialize the object */ -SPL_METHOD(Array, serialize) -{ - zval *object = getThis(); - spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); - int was_in_serialize = intern->serialize_data != NULL; - smart_str buf; - - if (!was_in_serialize) { - intern->serialize_data = emalloc(sizeof(php_serialize_data_t)); - PHP_VAR_SERIALIZE_INIT(*intern->serialize_data); - } - - buf = spl_array_serialize_helper(intern, intern->serialize_data TSRMLS_CC); - - if (!was_in_serialize) { - PHP_VAR_SERIALIZE_DESTROY(*intern->serialize_data); - efree(intern->serialize_data); - intern->serialize_data = NULL; - } - if (buf.c) { RETURN_STRINGL(buf.c, buf.len, 0); } @@ -1583,47 +1547,32 @@ RETURN_NULL(); } /* }}} */ -int spl_array_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC) /* {{{ */ +/* {{{ proto void ArrayObject::unserialize(string serialized) + * unserialize the object + */ +SPL_METHOD(Array, unserialize) { - spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); + spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (intern->fptr_serialize) { - int retval; - php_serialize_data_t *before; - - before = intern->serialize_data; - intern->serialize_data = (php_serialize_data_t *)data; - - retval = zend_user_serialize(object, buffer, buf_len, data TSRMLS_CC); - - intern->serialize_data = before; - - return retval; - } else { - smart_str buf; - - buf = spl_array_serialize_helper(intern, (php_serialize_data_t *)data TSRMLS_CC); - - if (buf.c) { - *buffer = (unsigned char*)estrndup(buf.c, buf.len); - *buf_len = buf.len; - efree(buf.c); - return SUCCESS; - } else { - return FAILURE; - } - } -} -/* }}} */ - -void spl_array_unserialize_helper(spl_array_object *intern, const unsigned char *buf, int buf_len, php_unserialize_data_t *var_hash_p TSRMLS_DC) /* {{{ */ -{ + char *buf; + int buf_len; const unsigned char *p, *s; + php_unserialize_data_t var_hash; zval *pmembers, *pflags = NULL; long flags; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &buf_len) == FAILURE) { + return; + } + if (buf_len == 0) { + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Empty serialized string cannot be empty"); + return; + } + /* storage */ - s = p = buf; + s = p = (const unsigned char*)buf; + PHP_VAR_UNSERIALIZE_INIT(var_hash); if (*p!= 'x' || *++p != ':') { goto outexcept; @@ -1631,7 +1580,7 @@ ++p; ALLOC_INIT_ZVAL(pflags); - if (!php_var_unserialize(&pflags, &p, s + buf_len, var_hash_p TSRMLS_CC) || Z_TYPE_P(pflags) != IS_LONG) { + if (!php_var_unserialize(&pflags, &p, s + buf_len, &var_hash TSRMLS_CC) || Z_TYPE_P(pflags) != IS_LONG) { zval_ptr_dtor(&pflags); goto outexcept; } @@ -1657,7 +1606,7 @@ intern->ar_flags |= flags & SPL_ARRAY_CLONE_MASK; zval_ptr_dtor(&intern->array); ALLOC_INIT_ZVAL(intern->array); - if (!php_var_unserialize(&intern->array, &p, s + buf_len, var_hash_p TSRMLS_CC)) { + if (!php_var_unserialize(&intern->array, &p, s + buf_len, &var_hash TSRMLS_CC)) { goto outexcept; } } @@ -1673,7 +1622,7 @@ ++p; ALLOC_INIT_ZVAL(pmembers); - if (!php_var_unserialize(&pmembers, &p, s + buf_len, var_hash_p TSRMLS_CC)) { + if (!php_var_unserialize(&pmembers, &p, s + buf_len, &var_hash TSRMLS_CC)) { zval_ptr_dtor(&pmembers); goto outexcept; } @@ -1683,80 +1632,17 @@ zval_ptr_dtor(&pmembers); /* done reading $serialized */ + + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); return; outexcept: - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Error at offset %ld of %d bytes", (long)((char*)p - (char *)buf), buf_len); + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Error at offset %ld of %d bytes", (long)((char*)p - buf), buf_len); return; -} -/* }}} */ - -/* {{{ proto void ArrayObject::unserialize(string serialized) - Unserialize the object */ -SPL_METHOD(Array, unserialize) -{ - char *buf; - int buf_len; - spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - int was_in_unserialize = intern->unserialize_data != NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &buf_len) == FAILURE) { - return; - } - - if (buf_len == 0) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Empty serialized string cannot be empty"); - return; - } - - if (!was_in_unserialize) { - intern->unserialize_data = emalloc(sizeof(php_unserialize_data_t)); - PHP_VAR_UNSERIALIZE_INIT(*intern->unserialize_data); - } - - spl_array_unserialize_helper(intern, (const unsigned char *)buf, buf_len, intern->unserialize_data TSRMLS_CC); - - if (!was_in_unserialize) { - PHP_VAR_UNSERIALIZE_DESTROY(*intern->unserialize_data); - efree(intern->unserialize_data); - intern->unserialize_data = NULL; - } } /* }}} */ -int spl_array_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC) -{ - spl_array_object *intern; - - object_init_ex(*object, ce); - intern = (spl_array_object*)zend_object_store_get_object(*object TSRMLS_CC); - - if (intern->fptr_unserialize) { - zval *zdata; - php_unserialize_data_t *before; - MAKE_STD_ZVAL(zdata); - ZVAL_STRINGL(zdata, (char *)buf, buf_len, 1); - - before = intern->unserialize_data; - intern->unserialize_data = (php_unserialize_data_t *)data; - - zend_call_method_with_1_params(object, ce, &ce->unserialize_func, "unserialize", NULL, zdata); - - intern->unserialize_data = before; - - zval_ptr_dtor(&zdata); - } else { - spl_array_unserialize_helper(intern, buf, buf_len, (php_unserialize_data_t *)data TSRMLS_CC); - } - - if (EG(exception)) { - return FAILURE; - } else { - return SUCCESS; - } -} -/* }}} */ - /* {{{ arginfo and function tbale */ ZEND_BEGIN_ARG_INFO(arginfo_array___construct, 0) ZEND_ARG_INFO(0, array) @@ -1872,8 +1758,6 @@ REGISTER_SPL_IMPLEMENTS(ArrayObject, Aggregate); REGISTER_SPL_IMPLEMENTS(ArrayObject, ArrayAccess); REGISTER_SPL_IMPLEMENTS(ArrayObject, Serializable); - spl_ce_ArrayObject->serialize = spl_array_serialize; - spl_ce_ArrayObject->unserialize = spl_array_unserialize; memcpy(&spl_handler_ArrayObject, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); spl_handler_ArrayObject.clone_obj = spl_array_object_clone; @@ -1896,8 +1780,6 @@ REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess); REGISTER_SPL_IMPLEMENTS(ArrayIterator, SeekableIterator); REGISTER_SPL_IMPLEMENTS(ArrayIterator, Serializable); - spl_ce_ArrayIterator->serialize = spl_array_serialize; - spl_ce_ArrayIterator->unserialize = spl_array_unserialize; memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; Index: ext/standard/basic_functions.h =================================================================== --- ext/standard/basic_functions.h (revision 299276) +++ ext/standard/basic_functions.h (working copy) @@ -207,6 +207,14 @@ /* var.c */ zend_class_entry *incomplete_class; + struct { + void *var_hash; + unsigned level; + } serialize; + struct { + void *var_hash; + unsigned level; + } unserialize; /* url_scanner_ex.re */ url_adapt_state_ex_t url_adapt_state_ex; Index: ext/standard/tests/serialize/bug36424.phpt =================================================================== --- ext/standard/tests/serialize/bug36424.phpt (revision 0) +++ ext/standard/tests/serialize/bug36424.phpt (revision 0) @@ -0,0 +1,72 @@ +--TEST-- +Bug #36424 - Serializable interface breaks object references +--FILE-- +$v) { + $this->$p=$v; + } + } +} +class b extends a {} +class c extends b {} + +$c = new c; +$c->a = new a; +$c->a->b = new b; +$c->a->b->c = $c; +$c->a->c = $c; +$c->a->b->a = $c->a; +$c->a->a = $c->a; + +$s = serialize($c); +printf("%s\n", $s); + +$d = unserialize($s); + +var_dump( + $d === $d->a->b->c, + $d->a->a === $d->a, + $d->a->b->a === $d->a, + $d->a->c === $d +); + +print_r($d); + +echo "Done\n"; + +?> +--EXPECTF-- +%aTEST +C:1:"c":108:{a:1:{s:1:"a";C:1:"a":81:{a:3:{s:1:"b";C:1:"b":30:{a:2:{s:1:"c";r:1;s:1:"a";r:3;}}s:1:"c";r:1;s:1:"a";r:3;}}}} +bool(true) +bool(true) +bool(true) +bool(true) +c Object +( + [a] => a Object + ( + [b] => b Object + ( + [c] => c Object + *RECURSION* + [a] => a Object + *RECURSION* + ) + + [c] => c Object + *RECURSION* + [a] => a Object + *RECURSION* + ) + +) +Done Index: ext/standard/var_unserializer.c =================================================================== --- ext/standard/var_unserializer.c (revision 299276) +++ ext/standard/var_unserializer.c (working copy) @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon Apr 12 10:11:22 2010 */ +/* Generated by re2c 0.13.5 on Fri May 21 10:28:05 2010 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -35,7 +35,7 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = var_hashx->first, *prev = NULL; + var_entries *var_hash = (*var_hashx)->first, *prev = NULL; while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { prev = var_hash; @@ -47,8 +47,8 @@ var_hash->used_slots = 0; var_hash->next = 0; - if (!var_hashx->first) - var_hashx->first = var_hash; + if (!(*var_hashx)->first) + (*var_hashx)->first = var_hash; else prev->next = var_hash; } @@ -58,7 +58,7 @@ static inline void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = var_hashx->first_dtor, *prev = NULL; + var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL; while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { prev = var_hash; @@ -70,8 +70,8 @@ var_hash->used_slots = 0; var_hash->next = 0; - if (!var_hashx->first_dtor) - var_hashx->first_dtor = var_hash; + if (!(*var_hashx)->first_dtor) + (*var_hashx)->first_dtor = var_hash; else prev->next = var_hash; } @@ -83,7 +83,7 @@ PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval) { long i; - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (var_hash) { for (i = 0; i < var_hash->used_slots; i++) { @@ -98,7 +98,7 @@ static int var_access(php_unserialize_data_t *var_hashx, long id, zval ***store) { - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (id >= VAR_ENTRIES_MAX && var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { var_hash = var_hash->next; @@ -118,7 +118,7 @@ { void *next; long i; - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (var_hash) { next = var_hash->next; @@ -126,7 +126,7 @@ var_hash = next; } - var_hash = var_hashx->first_dtor; + var_hash = (*var_hashx)->first_dtor; while (var_hash) { for (i = 0; i < var_hash->used_slots; i++) { Index: ext/standard/var.c =================================================================== --- ext/standard/var.c (revision 299276) +++ ext/standard/var.c (working copy) @@ -814,9 +814,9 @@ } /* }}} */ -PHPAPI void php_var_serialize(smart_str *buf, zval **struc, HashTable *var_hash TSRMLS_DC) /* {{{ */ +PHPAPI void php_var_serialize(smart_str *buf, zval **struc, php_serialize_data_t *var_hash TSRMLS_DC) /* {{{ */ { - php_var_serialize_intern(buf, *struc, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, *struc, *var_hash TSRMLS_CC); smart_str_0(buf); } /* }}} */ Index: ext/standard/php_var.h =================================================================== --- ext/standard/php_var.h (revision 299276) +++ ext/standard/php_var.h (working copy) @@ -21,6 +21,7 @@ #ifndef PHP_VAR_H #define PHP_VAR_H +#include "ext/standard/basic_functions.h" #include "ext/standard/php_smart_str_public.h" PHP_FUNCTION(var_dump); @@ -35,30 +36,69 @@ PHPAPI void php_var_export(zval **struc, int level TSRMLS_DC); PHPAPI void php_debug_zval_dump(zval **struc, int level TSRMLS_DC); -/* typdef HashTable php_serialize_data_t; */ -#define php_serialize_data_t HashTable +typedef HashTable* php_serialize_data_t; struct php_unserialize_data { void *first; void *first_dtor; }; -typedef struct php_unserialize_data php_unserialize_data_t; +typedef struct php_unserialize_data* php_unserialize_data_t; PHPAPI void php_var_serialize(smart_str *buf, zval **struc, php_serialize_data_t *var_hash TSRMLS_DC); PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash TSRMLS_DC); -#define PHP_VAR_SERIALIZE_INIT(var_hash) \ - zend_hash_init(&(var_hash), 10, NULL, NULL, 0) -#define PHP_VAR_SERIALIZE_DESTROY(var_hash) \ - zend_hash_destroy(&(var_hash)) +#define PHP_VAR_SERIALIZE_INIT(var_hash_ptr) \ +do { \ + if (BG(serialize).level) { \ + (var_hash_ptr) = BG(serialize).var_hash; \ + ++BG(serialize).level; \ + } else { \ + ALLOC_HASHTABLE(var_hash_ptr); \ + zend_hash_init((var_hash_ptr), 10, NULL, NULL, 0); \ + BG(serialize).var_hash = (var_hash_ptr); \ + BG(serialize).level = 1; \ + } \ +} while(0) -#define PHP_VAR_UNSERIALIZE_INIT(var_hash) \ - (var_hash).first = 0; \ - (var_hash).first_dtor = 0 -#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash) \ - var_destroy(&(var_hash)) +#define PHP_VAR_SERIALIZE_DESTROY(var_hash_ptr) \ +do { \ + if (BG(serialize).level) { \ + if (!--BG(serialize).level) { \ + zend_hash_destroy(BG(serialize).var_hash); \ + FREE_HASHTABLE(BG(serialize).var_hash); \ + BG(serialize).var_hash = NULL; \ + } \ + } else { \ + zend_hash_destroy((var_hash_ptr)); \ + } \ +} while (0) +#define PHP_VAR_UNSERIALIZE_INIT(var_hash_ptr) \ +do { \ + if (BG(unserialize).level) { \ + (var_hash_ptr) = BG(unserialize).var_hash; \ + ++BG(unserialize).level; \ + } else { \ + (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \ + BG(unserialize).var_hash = (var_hash_ptr); \ + BG(unserialize).level = 1; \ + } \ +} while (0) + +#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash_ptr) \ +do { \ + if (BG(unserialize).level) { \ + if (!--BG(unserialize).level) { \ + var_destroy(&(var_hash_ptr)); \ + efree((var_hash_ptr)); \ + BG(unserialize).var_hash = NULL; \ + } \ + } else { \ + var_destroy(&(var_hash_ptr)); \ + } \ +} while (0) + PHPAPI void var_replace(php_unserialize_data_t *var_hash, zval *ozval, zval **nzval); PHPAPI void var_destroy(php_unserialize_data_t *var_hash); Index: ext/standard/var_unserializer.re =================================================================== --- ext/standard/var_unserializer.re (revision 299276) +++ ext/standard/var_unserializer.re (working copy) @@ -33,7 +33,7 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = var_hashx->first, *prev = NULL; + var_entries *var_hash = (*var_hashx)->first, *prev = NULL; while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { prev = var_hash; @@ -45,8 +45,8 @@ var_hash->used_slots = 0; var_hash->next = 0; - if (!var_hashx->first) - var_hashx->first = var_hash; + if (!(*var_hashx)->first) + (*var_hashx)->first = var_hash; else prev->next = var_hash; } @@ -56,7 +56,7 @@ static inline void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = var_hashx->first_dtor, *prev = NULL; + var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL; while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { prev = var_hash; @@ -68,8 +68,8 @@ var_hash->used_slots = 0; var_hash->next = 0; - if (!var_hashx->first_dtor) - var_hashx->first_dtor = var_hash; + if (!(*var_hashx)->first_dtor) + (*var_hashx)->first_dtor = var_hash; else prev->next = var_hash; } @@ -81,7 +81,7 @@ PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval) { long i; - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (var_hash) { for (i = 0; i < var_hash->used_slots; i++) { @@ -96,7 +96,7 @@ static int var_access(php_unserialize_data_t *var_hashx, long id, zval ***store) { - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (id >= VAR_ENTRIES_MAX && var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { var_hash = var_hash->next; @@ -116,7 +116,7 @@ { void *next; long i; - var_entries *var_hash = var_hashx->first; + var_entries *var_hash = (*var_hashx)->first; while (var_hash) { next = var_hash->next; @@ -124,7 +124,7 @@ var_hash = next; } - var_hash = var_hashx->first_dtor; + var_hash = (*var_hashx)->first_dtor; while (var_hash) { for (i = 0; i < var_hash->used_slots; i++) {