summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-06-23 12:00:13 +0000
committerDmitry Stogov <dmitry@php.net>2005-06-23 12:00:13 +0000
commitf3f97394b2f650914933dba8701b95bef69eb62a (patch)
tree88b86dd767cf1ac564249e0e2f6e239a4d2eacc5 /Zend/zend_builtin_functions.c
parent544387905386c30a1f9e801436782858c7a17bbb (diff)
downloadphp-git-f3f97394b2f650914933dba8701b95bef69eb62a.tar.gz
Fixed bug #28377 (debug_backtrace is intermittently passing args)
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index ba54430bbe..37af1069b9 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1622,6 +1622,12 @@ static zval *debug_backtrace_get_args(void ***curpos TSRMLS_DC)
(*arg)->refcount++;
add_next_index_zval(arg_array, *arg);
}
+
+ /* skip args from incomplete frames */
+ while ((((*curpos)-1) > EG(argument_stack).elements) && *((*curpos)-1)) {
+ (*curpos)--;
+ }
+
return arg_array;
}
@@ -1669,6 +1675,11 @@ ZEND_FUNCTION(debug_print_backtrace)
args -= *(ulong*)args;
frames_on_stack++;
+ /* skip args from incomplete frames */
+ while (((args-1) > EG(argument_stack).elements) && *(args-1)) {
+ args--;
+ }
+
if ((args-1) == EG(argument_stack).elements) {
arg_stack_consistent = 1;
break;
@@ -1682,6 +1693,13 @@ ZEND_FUNCTION(debug_print_backtrace)
cur_arg_pos -= 2;
frames_on_stack--;
+ if (arg_stack_consistent) {
+ /* skip args from incomplete frames */
+ while (((cur_arg_pos-1) > EG(argument_stack).elements) && *(cur_arg_pos-1)) {
+ cur_arg_pos--;
+ }
+ }
+
array_init(return_value);
while (ptr) {
@@ -1817,6 +1835,11 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last TSRML
args -= *(ulong*)args;
frames_on_stack++;
+ /* skip args from incomplete frames */
+ while (((args-1) > EG(argument_stack).elements) && *(args-1)) {
+ args--;
+ }
+
if ((args-1) == EG(argument_stack).elements) {
arg_stack_consistent = 1;
break;
@@ -1836,6 +1859,13 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last TSRML
cur_arg_pos -= (arg_count + 2);
frames_on_stack--;
ptr = ptr->prev_execute_data;
+
+ if (arg_stack_consistent) {
+ /* skip args from incomplete frames */
+ while (((cur_arg_pos-1) > EG(argument_stack).elements) && *(cur_arg_pos-1)) {
+ cur_arg_pos--;
+ }
+ }
}
array_init(return_value);