diff options
| author | Dmitry Stogov <dmitry@php.net> | 2010-06-11 08:53:31 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2010-06-11 08:53:31 +0000 |
| commit | d42dbb3bed2ab53bf0f7576187fbd86c5a0e1531 (patch) | |
| tree | 35f67018fed11b049ba567ad1d283d7a67508402 | |
| parent | 6c0ddd0b6f1fd538c779aa533c328241cb619fef (diff) | |
| download | php-git-d42dbb3bed2ab53bf0f7576187fbd86c5a0e1531.tar.gz | |
Fixed bug #51552 (debug_backtrace() causes segmentation fault and/or memory issues)
| -rw-r--r-- | ext/standard/array.c | 9 | ||||
| -rw-r--r-- | ext/standard/tests/array/bug51552.phpt | 23 |
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 |
