const unsigned char *p;
php_unserialize_data_t var_hash;
zval *options = NULL, *classes = NULL;
+ zval *retval;
HashTable *class_hash = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|a", &buf, &buf_len, &options) == FAILURE) {
}
}
- if (!php_var_unserialize_ex(return_value, &p, p + buf_len, &var_hash, class_hash)) {
+ 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);
}
- zval_ptr_dtor(return_value);
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;
}
- /* 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);
+
+ ZVAL_COPY(return_value, retval);
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
if (class_hash) {