diff options
| -rw-r--r-- | NEWS | 1 | ||||
| -rw-r--r-- | Zend/tests/bug70547.phpt | 44 | ||||
| -rw-r--r-- | Zend/zend_builtin_functions.c | 24 |
3 files changed, 41 insertions, 28 deletions
@@ -3,6 +3,7 @@ PHP NEWS 01 Oct 2015, PHP 7.0.0 RC 4 - Core: + . Fixed bug #70555 (fun_get_arg() on unsetted vars return UNKNOW). (Laruence) . Fixed bug #70547 (unsetting function variables corrupts backtrace). (Laruence) . Fixed bug #70528 (assert() with instanceof adds apostrophes around class diff --git a/Zend/tests/bug70547.phpt b/Zend/tests/bug70547.phpt index 0b9daf869d..1b4c35d65f 100644 --- a/Zend/tests/bug70547.phpt +++ b/Zend/tests/bug70547.phpt @@ -6,14 +6,20 @@ function brokenTrace($arg1, &$arg2, $arg3){ backtraceWrapper(); var_dump(func_get_args()); unset($arg3); + var_dump(func_get_arg(0)); + var_dump(func_get_arg(1)); + var_dump(func_get_arg(2)); + var_dump(func_get_arg(3)); backtraceWrapper(); - var_dump(func_get_args()); unset($arg1); - backtraceWrapper(); var_dump(func_get_args()); + backtraceWrapper(); unset($arg2); backtraceWrapper(); - var_dump(func_get_args()); + var_dump(func_get_arg(0)); + var_dump(func_get_arg(1)); + var_dump(func_get_arg(2)); + var_dump(func_get_arg(3)); } $arg2 = "2nd"; brokenTrace("1st", $arg2, "3th", "4th"); @@ -43,39 +49,35 @@ array(4) { [3]=> string(3) "4th" } +string(3) "1st" +string(3) "2nd" +NULL +string(3) "4th" array(3) { [0]=> string(3) "1st" [1]=> &string(3) "2nd" - [2]=> - string(3) "4th" -} -array(3) { - [0]=> - string(3) "1st" - [1]=> - string(3) "2nd" - [2]=> + [3]=> string(3) "4th" } array(2) { - [0]=> - &string(3) "2nd" [1]=> + string(3) "2nd" + [3]=> string(3) "4th" } array(2) { - [0]=> - string(3) "2nd" [1]=> + &string(3) "2nd" + [3]=> string(3) "4th" } array(1) { - [0]=> - string(3) "4th" -} -array(1) { - [0]=> + [3]=> string(3) "4th" } +NULL +NULL +NULL +string(3) "4th" diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 3bdc94d7d7..8ffdcaa0bc 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -471,8 +471,10 @@ ZEND_FUNCTION(func_get_arg) } else { arg = ZEND_CALL_ARG(ex, requested_offset + 1); } - ZVAL_DEREF(arg); - ZVAL_COPY(return_value, arg); + if (EXPECTED(!Z_ISUNDEF_P(arg))) { + ZVAL_DEREF(arg); + ZVAL_COPY(return_value, arg); + } } /* }}} */ @@ -482,7 +484,7 @@ ZEND_FUNCTION(func_get_args) { zval *p, *q; uint32_t arg_count, first_extra_arg; - uint32_t i; + uint32_t i, n; zend_execute_data *ex = EX(prev_execute_data); if (ZEND_CALL_INFO(ex) & ZEND_CALL_CODE) { @@ -498,6 +500,7 @@ ZEND_FUNCTION(func_get_args) zend_hash_real_init(Z_ARRVAL_P(return_value), 1); ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { i = 0; + n = 0; p = ZEND_CALL_ARG(ex, 1); if (arg_count > first_extra_arg) { while (i < first_extra_arg) { @@ -507,8 +510,9 @@ ZEND_FUNCTION(func_get_args) if (Z_OPT_REFCOUNTED_P(q)) { Z_ADDREF_P(q); } - ZEND_HASH_FILL_ADD(q); + n++; } + ZEND_HASH_FILL_ADD(q); p++; i++; } @@ -521,12 +525,14 @@ ZEND_FUNCTION(func_get_args) if (Z_OPT_REFCOUNTED_P(q)) { Z_ADDREF_P(q); } - ZEND_HASH_FILL_ADD(q); + n++; } + ZEND_HASH_FILL_ADD(q); p++; i++; } } ZEND_HASH_FILL_END(); + Z_ARRVAL_P(return_value)->nNumOfElements = n; } } /* }}} */ @@ -2232,6 +2238,7 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / array_init_size(arg_array, num_args); if (num_args) { uint32_t i = 0; + uint32_t n = 0; zval *p = ZEND_CALL_ARG(call, 1); zend_hash_real_init(Z_ARRVAL_P(arg_array), 1); @@ -2245,8 +2252,9 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / if (Z_OPT_REFCOUNTED_P(p)) { Z_ADDREF_P(p); } - ZEND_HASH_FILL_ADD(p); + n++; } + ZEND_HASH_FILL_ADD(p); p++; i++; } @@ -2259,12 +2267,14 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / if (Z_OPT_REFCOUNTED_P(p)) { Z_ADDREF_P(p); } - ZEND_HASH_FILL_ADD(p); + n++; } + ZEND_HASH_FILL_ADD(p); p++; i++; } } ZEND_HASH_FILL_END(); + Z_ARRVAL_P(arg_array)->nNumOfElements = n; } } /* }}} */ |
