com php-src: Merge branch 'PHP-7.0' into PHP-7.1: ext/standard/var.c
| From: | Nikita Popov | Date: | Sat, 05 Nov 2016 22:10:19 +0000 |
| Subject: | com php-src: Merge branch 'PHP-7.0' into PHP-7.1: ext/standard/var.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-95410@lists.php.net to get a copy of this message | ||
Commit: c0762bd8c8e6602a1c2a9e3d795bd5d779fb7abc
Author: Nikita Popov <nikic@php.net> Sat, 5 Nov 2016 23:10:19 +0100
Parents: faae3122d24ef8f241168ca5b9535355583ae3a0 b2af4e8868726a040234de113436c6e4f6372d17
Branches: PHP-7.1
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=c0762bd8c8e6602a1c2a9e3d795bd5d779fb7abc
Log:
Merge branch 'PHP-7.0' into PHP-7.1
Changed paths:
MM ext/standard/var.c
Diff:
diff --cc ext/standard/var.c
index 8722f3d,88719cc...7e84c91
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@@ -1065,7 -1036,8 +1065,8 @@@ PHP_FUNCTION(unserialize
const unsigned char *p;
php_unserialize_data_t var_hash;
zval *options = NULL, *classes = NULL;
+ zval *retval;
- HashTable *class_hash = NULL;
+ HashTable *class_hash = NULL, *prev_class_hash;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|a", &buf, &buf_len, &options)
== FAILURE) {
RETURN_FALSE;
@@@ -1102,27 -1066,25 +1103,21 @@@
zend_string_release(lcname);
} ZEND_HASH_FOREACH_END();
}
+ php_var_unserialize_set_allowed_classes(var_hash, class_hash);
}
- if (!php_var_unserialize(return_value, &p, p + buf_len, &var_hash)) {
- zval_ptr_dtor(return_value);
+ retval = var_tmp_var(&var_hash);
- if (!php_var_unserialize_ex(retval, &p, p + buf_len, &var_hash, class_hash)) {
- PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
- if (class_hash) {
- zend_hash_destroy(class_hash);
- FREE_HASHTABLE(class_hash);
- }
++ if (!php_var_unserialize(retval, &p, p + buf_len, &var_hash)) {
if (!EG(exception)) {
php_error_docref(NULL, E_NOTICE, "Error at offset " ZEND_LONG_FMT " of %zd
bytes",
(zend_long)((char*)p - buf), buf_len);
}
- RETURN_FALSE;
+ RETVAL_FALSE;
+ } else {
- /* We should keep an reference to return_value to prevent it from being dtor
- in case nesting calls to unserialize */
- var_push_dtor(&var_hash, return_value);
-
- /* Ensure return value is a value */
- if (Z_ISREF_P(return_value)) {
- zend_unwrap_reference(return_value);
- }
++ ZVAL_DEREF(retval);
++ ZVAL_COPY(return_value, retval);
}
- ZVAL_COPY(return_value, retval);
-
- PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
if (class_hash) {
zend_hash_destroy(class_hash);
FREE_HASHTABLE(class_hash);