summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2010-06-11 08:53:31 +0000
committerDmitry Stogov <dmitry@php.net>2010-06-11 08:53:31 +0000
commitd42dbb3bed2ab53bf0f7576187fbd86c5a0e1531 (patch)
tree35f67018fed11b049ba567ad1d283d7a67508402
parent6c0ddd0b6f1fd538c779aa533c328241cb619fef (diff)
downloadphp-git-d42dbb3bed2ab53bf0f7576187fbd86c5a0e1531.tar.gz
Fixed bug #51552 (debug_backtrace() causes segmentation fault and/or memory issues)
-rw-r--r--ext/standard/array.c9
-rw-r--r--ext/standard/tests/array/bug51552.phpt23
2 files changed, 32 insertions, 0 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 3ea0486e66..99b9e78c31 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1057,6 +1057,9 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive
/* Set up known arguments */
args[1] = &key;
args[2] = userdata;
+ if (userdata) {
+ Z_ADDREF_PP(userdata);
+ }
zend_hash_internal_pointer_reset_ex(target_hash, &pos);
@@ -1076,6 +1079,9 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive
thash = Z_ARRVAL_PP(args[0]);
if (thash->nApplyCount > 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected");
+ if (userdata) {
+ zval_ptr_dtor(userdata);
+ }
return 0;
}
@@ -1126,6 +1132,9 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive
zend_hash_move_forward_ex(target_hash, &pos);
}
+ if (userdata) {
+ zval_ptr_dtor(userdata);
+ }
return 0;
}
/* }}} */
diff --git a/ext/standard/tests/array/bug51552.phpt b/ext/standard/tests/array/bug51552.phpt
new file mode 100644
index 0000000000..fb61f489b0
--- /dev/null
+++ b/ext/standard/tests/array/bug51552.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #51552 (debug_backtrace() causes segmentation fault and/or memory issues)
+--FILE--
+<?php
+function walk($element, $key, $p) {
+ $backtrace = debug_backtrace();
+ echo "$element\n";
+}
+
+$a = array(1,2,3,4,5,6,7,8,9,10);
+array_walk($a, 'walk', 'testthis');
+?>
+--EXPECT--
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10