--- embedaddon/php/Zend/zend_variables.c 2012/02/21 23:47:52 1.1.1.1 +++ embedaddon/php/Zend/zend_variables.c 2014/06/15 20:04:04 1.1.1.4 @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_variables.c,v 1.1.1.1 2012/02/21 23:47:52 misho Exp $ */ +/* $Id: zend_variables.c,v 1.1.1.4 2014/06/15 20:04:04 misho Exp $ */ #include #include "zend.h" @@ -34,15 +34,14 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_L case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); STR_FREE_REL(zvalue->value.str.val); -#if SUHOSIN_PATCH - zvalue->value.str.len = 0; -#endif break; case IS_ARRAY: case IS_CONSTANT_ARRAY: { TSRMLS_FETCH(); if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) { + /* break possible cycles */ + Z_TYPE_P(zvalue) = IS_NULL; zend_hash_destroy(zvalue->value.ht); FREE_HASHTABLE(zvalue->value.ht); } @@ -80,10 +79,7 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FI case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - free(zvalue->value.str.val); -#if SUHOSIN_PATCH - zvalue->value.str.len = 0; -#endif + str_free(zvalue->value.str.val); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: @@ -123,7 +119,9 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_F case IS_CONSTANT: case IS_STRING: CHECK_ZVAL_STRING_REL(zvalue); - zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len); + if (!IS_INTERNED(zvalue->value.str.val)) { + zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len); + } break; case IS_ARRAY: case IS_CONSTANT_ARRAY: { @@ -165,18 +163,7 @@ ZEND_API void _zval_dtor_wrapper(zval *zvalue) zval_dtor(zvalue); } -ZEND_API void zval_property_ctor(zval **p) /* {{{ */ -{ - zval *orig_ptr = *p; - ALLOC_ZVAL(*p); - **p = *orig_ptr; - zval_copy_ctor(*p); - Z_SET_REFCOUNT_PP(p, 1); - Z_UNSET_ISREF_PP(p); -} -/* }}} */ - #if ZEND_DEBUG ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) { @@ -201,6 +188,51 @@ ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **z zval_internal_ptr_dtor(zval_ptr); } #endif + +ZEND_API int zval_copy_static_var(zval **p TSRMLS_DC, int num_args, va_list args, zend_hash_key *key) /* {{{ */ +{ + HashTable *target = va_arg(args, HashTable*); + zend_bool is_ref; + zval *tmp; + + if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) { + is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF; + + if (!EG(active_symbol_table)) { + zend_rebuild_symbol_table(TSRMLS_C); + } + if (zend_hash_quick_find(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, (void **) &p) == FAILURE) { + if (is_ref) { + ALLOC_INIT_ZVAL(tmp); + Z_SET_ISREF_P(tmp); + zend_hash_quick_add(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), (void**)&p); + } else { + tmp = EG(uninitialized_zval_ptr); + zend_error(E_NOTICE,"Undefined variable: %s", key->arKey); + } + } else { + if (is_ref) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(p); + tmp = *p; + } else if (Z_ISREF_PP(p)) { + ALLOC_INIT_ZVAL(tmp); + ZVAL_COPY_VALUE(tmp, *p); + zval_copy_ctor(tmp); + Z_SET_REFCOUNT_P(tmp, 0); + Z_UNSET_ISREF_P(tmp); + } else { + tmp = *p; + } + } + } else { + tmp = *p; + } + if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), NULL) == SUCCESS) { + Z_ADDREF_P(tmp); + } + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ /* * Local variables: