tony2001 Fri Dec 8 20:59:31 2006 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/standard php_var.h var.c Log: MFH: fix possible issue in the serializer, which might currupt struc when reallocating arguments stack
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/php_var.h?r1=1.30.2.1.2.1&r2=1.30.2.1.2.2&diff_format=u Index: php-src/ext/standard/php_var.h diff -u php-src/ext/standard/php_var.h:1.30.2.1.2.1 php-src/ext/standard/php_var.h:1.30.2.1.2.2 --- php-src/ext/standard/php_var.h:1.30.2.1.2.1 Tue May 30 14:51:20 2006 +++ php-src/ext/standard/php_var.h Fri Dec 8 20:59:31 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_var.h,v 1.30.2.1.2.1 2006/05/30 14:51:20 iliaa Exp $ */ +/* $Id: php_var.h,v 1.30.2.1.2.2 2006/12/08 20:59:31 tony2001 Exp $ */ #ifndef PHP_VAR_H #define PHP_VAR_H @@ -47,7 +47,7 @@ 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 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) \ http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var.c?r1=1.203.2.7.2.8&r2=1.203.2.7.2.9&diff_format=u Index: php-src/ext/standard/var.c diff -u php-src/ext/standard/var.c:1.203.2.7.2.8 php-src/ext/standard/var.c:1.203.2.7.2.9 --- php-src/ext/standard/var.c:1.203.2.7.2.8 Mon Oct 9 18:08:34 2006 +++ php-src/ext/standard/var.c Fri Dec 8 20:59:31 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var.c,v 1.203.2.7.2.8 2006/10/09 18:08:34 iliaa Exp $ */ +/* $Id: var.c,v 1.203.2.7.2.9 2006/12/08 20:59:31 tony2001 Exp $ */ @@ -487,7 +487,7 @@ /* {{{ php_var_serialize */ -static void php_var_serialize_intern(smart_str *buf, zval **struc, HashTable *var_hash TSRMLS_DC); +static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var_hash TSRMLS_DC); static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old TSRMLS_DC) { @@ -542,11 +542,11 @@ smart_str_appendl(buf, "\";", 2); } -static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval **struc TSRMLS_DC) +static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval *struc TSRMLS_DC) { PHP_CLASS_ATTRIBUTES; - PHP_SET_CLASS_ATTRIBUTES(*struc); + PHP_SET_CLASS_ATTRIBUTES(struc); smart_str_appendl(buf, "O:", 2); smart_str_append_long(buf, name_len); smart_str_appendl(buf, ":\"", 2); @@ -556,7 +556,7 @@ return incomplete_class; } -static void php_var_serialize_class(smart_str *buf, zval **struc, zval *retval_ptr, HashTable *var_hash TSRMLS_DC) +static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_ptr, HashTable *var_hash TSRMLS_DC) { int count; zend_bool incomplete_class; @@ -606,13 +606,13 @@ smart_str_appendl(buf,"N;", 2); continue; } - if (zend_hash_find(Z_OBJPROP_PP(struc), Z_STRVAL_PP(name), + if (zend_hash_find(Z_OBJPROP_P(struc), Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) { php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); - php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC); } else { zend_class_entry *ce; - ce = zend_get_class_entry(*struc TSRMLS_CC); + ce = zend_get_class_entry(struc TSRMLS_CC); if (ce) { char *prot_name, *priv_name; int prop_name_length; @@ -620,29 +620,29 @@ do { zend_mangle_property_name(&priv_name, &prop_name_length, ce->name, ce->name_length, Z_STRVAL_PP(name), Z_STRLEN_PP(name), ce->type & ZEND_INTERNAL_CLASS); - if (zend_hash_find(Z_OBJPROP_PP(struc), priv_name, prop_name_length+1, (void *) &d) == SUCCESS) { + if (zend_hash_find(Z_OBJPROP_P(struc), priv_name, prop_name_length+1, (void *) &d) == SUCCESS) { php_var_serialize_string(buf, priv_name, prop_name_length); efree(priv_name); - php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC); break; } efree(priv_name); zend_mangle_property_name(&prot_name, &prop_name_length, "*", 1, Z_STRVAL_PP(name), Z_STRLEN_PP(name), ce->type & ZEND_INTERNAL_CLASS); - if (zend_hash_find(Z_OBJPROP_PP(struc), prot_name, prop_name_length+1, (void *) &d) == SUCCESS) { + if (zend_hash_find(Z_OBJPROP_P(struc), prot_name, prop_name_length+1, (void *) &d) == SUCCESS) { php_var_serialize_string(buf, prot_name, prop_name_length); efree(prot_name); - php_var_serialize_intern(buf, d, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC); break; } efree(prot_name); php_error_docref(NULL TSRMLS_CC, E_NOTICE, "\"%s\" returned as member variable from __sleep() but does not exist", Z_STRVAL_PP(name)); php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); - php_var_serialize_intern(buf, &nvalp, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, nvalp, var_hash TSRMLS_CC); } while (0); } else { php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name)); - php_var_serialize_intern(buf, &nvalp, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, nvalp, var_hash TSRMLS_CC); } } } @@ -651,20 +651,20 @@ } -static void php_var_serialize_intern(smart_str *buf, zval **struc, HashTable *var_hash TSRMLS_DC) +static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var_hash TSRMLS_DC) { int i; ulong *var_already; HashTable *myht; if (var_hash - && php_add_var_hash(var_hash, *struc, (void *) &var_already TSRMLS_CC) == FAILURE) { - if((*struc)->is_ref) { + && php_add_var_hash(var_hash, struc, (void *) &var_already TSRMLS_CC) == FAILURE) { + if(struc->is_ref) { smart_str_appendl(buf, "R:", 2); smart_str_append_long(buf, *var_already); smart_str_appendc(buf, ';'); return; - } else if(Z_TYPE_PP(struc) == IS_OBJECT) { + } else if(Z_TYPE_P(struc) == IS_OBJECT) { smart_str_appendl(buf, "r:", 2); smart_str_append_long(buf, *var_already); smart_str_appendc(buf, ';'); @@ -672,10 +672,10 @@ } } - switch (Z_TYPE_PP(struc)) { + switch (Z_TYPE_P(struc)) { case IS_BOOL: smart_str_appendl(buf, "b:", 2); - smart_str_append_long(buf, Z_LVAL_PP(struc)); + smart_str_append_long(buf, Z_LVAL_P(struc)); smart_str_appendc(buf, ';'); return; @@ -684,21 +684,21 @@ return; case IS_LONG: - php_var_serialize_long(buf, Z_LVAL_PP(struc)); + php_var_serialize_long(buf, Z_LVAL_P(struc)); return; case IS_DOUBLE: { char *s; ulong slen; - slen = spprintf(&s, 0, "d:%.*G;", (int) PG(serialize_precision), Z_DVAL_PP(struc)); + slen = spprintf(&s, 0, "d:%.*G;", (int) PG(serialize_precision), Z_DVAL_P(struc)); smart_str_appendl(buf, s, slen); efree(s); return; } case IS_STRING: - php_var_serialize_string(buf, Z_STRVAL_PP(struc), Z_STRLEN_PP(struc)); + php_var_serialize_string(buf, Z_STRVAL_P(struc), Z_STRLEN_P(struc)); return; case IS_OBJECT: { @@ -707,8 +707,8 @@ int res; zend_class_entry *ce = NULL; - if(Z_OBJ_HT_PP(struc)->get_class_entry) { - ce = Z_OBJCE_PP(struc); + if(Z_OBJ_HT_P(struc)->get_class_entry) { + ce = Z_OBJCE_P(struc); } if(ce && ce->serialize != NULL) { @@ -716,11 +716,11 @@ unsigned char *serialized_data = NULL; zend_uint serialized_length; - if(ce->serialize(*struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash TSRMLS_CC) == SUCCESS) { + if(ce->serialize(struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash TSRMLS_CC) == SUCCESS) { smart_str_appendl(buf, "C:", 2); - smart_str_append_long(buf, Z_OBJCE_PP(struc)->name_length); + smart_str_append_long(buf, Z_OBJCE_P(struc)->name_length); smart_str_appendl(buf, ":\"", 2); - smart_str_appendl(buf, Z_OBJCE_PP(struc)->name, Z_OBJCE_PP(struc)->name_length); + smart_str_appendl(buf, Z_OBJCE_P(struc)->name, Z_OBJCE_P(struc)->name_length); smart_str_appendl(buf, "\":", 2); smart_str_append_long(buf, serialized_length); @@ -740,7 +740,7 @@ zend_hash_exists(&ce->function_table, "__sleep", sizeof("__sleep"))) { INIT_PZVAL(&fname); ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1, 0); - res = call_user_function_ex(CG(function_table), struc, &fname, + res = call_user_function_ex(CG(function_table), &struc, &fname, &retval_ptr, 0, 0, 1, NULL TSRMLS_CC); if (res == SUCCESS && !EG(exception)) { @@ -769,12 +769,12 @@ } case IS_ARRAY: { zend_bool incomplete_class = 0; - if (Z_TYPE_PP(struc) == IS_ARRAY) { + if (Z_TYPE_P(struc) == IS_ARRAY) { smart_str_appendl(buf, "a:", 2); - myht = HASH_OF(*struc); + myht = HASH_OF(struc); } else { incomplete_class = php_var_serialize_class_name(buf, struc TSRMLS_CC); - myht = Z_OBJPROP_PP(struc); + myht = Z_OBJPROP_P(struc); } /* count after serializing name, since php_var_serialize_class_name changes the count if the variable is incomplete class */ @@ -816,7 +816,7 @@ if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) != SUCCESS || !data - || data == struc + || data == &struc || (Z_TYPE_PP(data) == IS_ARRAY && Z_ARRVAL_PP(data)->nApplyCount > 1) ) { smart_str_appendl(buf, "N;", 2); @@ -824,7 +824,7 @@ if (Z_TYPE_PP(data) == IS_ARRAY) { Z_ARRVAL_PP(data)->nApplyCount++; } - php_var_serialize_intern(buf, data, var_hash TSRMLS_CC); + php_var_serialize_intern(buf, *data, var_hash TSRMLS_CC); if (Z_TYPE_PP(data) == IS_ARRAY) { Z_ARRVAL_PP(data)->nApplyCount--; } @@ -840,7 +840,7 @@ } } -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, HashTable *var_hash TSRMLS_DC) { php_var_serialize_intern(buf, struc, var_hash TSRMLS_CC); smart_str_0(buf); @@ -865,7 +865,7 @@ Z_STRLEN_P(return_value) = 0; PHP_VAR_SERIALIZE_INIT(var_hash); - php_var_serialize(&buf, struc, &var_hash TSRMLS_CC); + php_var_serialize(&buf, *struc, &var_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(var_hash); if (buf.c) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php