summaryrefslogtreecommitdiff
path: root/ext/standard/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/var.c')
-rw-r--r--ext/standard/var.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/ext/standard/var.c b/ext/standard/var.c
index bc76699070..ca621dd8a4 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -1039,7 +1039,7 @@ PHP_FUNCTION(unserialize)
if (!php_var_unserialize_ex(return_value, &p, p + buf_len, &var_hash, class_hash)) {
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
- if(class_hash) {
+ if (class_hash) {
zend_hash_destroy(class_hash);
FREE_HASHTABLE(class_hash);
}
@@ -1050,8 +1050,12 @@ PHP_FUNCTION(unserialize)
}
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);
+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
- if(class_hash) {
+ if (class_hash) {
zend_hash_destroy(class_hash);
FREE_HASHTABLE(class_hash);
}