Re: com php-src: Fixed #70547 similar bug in func_get_args: Zend/tests/bug70547.phpt Zend/zend_builtin_functions.c
| From: | Xinchen Hui | Date: | Wed, 23 Sep 2015 01:42:40 +0000 |
| Subject: | Re: com php-src: Fixed #70547 similar bug in func_get_args: Zend/tests/bug70547.phpt Zend/zend_builtin_functions.c | ||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-89123@lists.php.net to get a copy of this message | ||
Hey:
On Tue, Sep 22, 2015 at 10:44 PM, Nikita Popov <nikita.ppv@gmail.com> wrote:
> On Tue, Sep 22, 2015 at 1:58 PM, Xinchen Hui <laruence@php.net> wrote:
>>
>> Commit: 0f3ab1c2d03c27ebee0156cd8bfbb1c5721d9f32
>> Author: Xinchen Hui <laruence@gmail.com> Tue, 22 Sep 2015
>> 13:58:42 +0800
>> Parents: b8ea991821753898ba30fa170b25eadd3fc703b2
>> Branches: PHP-7.0 master
>>
>> Link:
>>
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=0f3ab1c2d03c27ebee0156cd8bfbb1c5721d9f32
>>
>> Log:
>> Fixed #70547 similar bug in func_get_args
>>
>> Bugs:
>> https://bugs.php.net/70547
>>
>> Changed paths:
>> M Zend/tests/bug70547.phpt
>> M Zend/zend_builtin_functions.c
>>
>>
>> Diff:
>> diff --git a/Zend/tests/bug70547.phpt b/Zend/tests/bug70547.phpt
>> index 195495d..0b9daf8 100644
>> --- a/Zend/tests/bug70547.phpt
>> +++ b/Zend/tests/bug70547.phpt
>> @@ -2,19 +2,24 @@
>> Bug #70547 (unsetting function variables corrupts backtrace)
>> --FILE--
>> <?php
>> -function brokenTrace($arg1, $arg2, $arg3){
>> - backtraceWrapper();
>> +function brokenTrace($arg1, &$arg2, $arg3){
>> + backtraceWrapper();
>> + var_dump(func_get_args());
>> unset($arg3);
>> - backtraceWrapper();
>> - unset($arg1);
>> - backtraceWrapper();
>> - unset($arg2);
>> - backtraceWrapper();
>> + backtraceWrapper();
>> + var_dump(func_get_args());
>> + unset($arg1);
>> + backtraceWrapper();
>> + var_dump(func_get_args());
>> + unset($arg2);
>> + backtraceWrapper();
>> + var_dump(func_get_args());
>> }
>> -brokenTrace("1st", "2nd", "3th", "4th");
>> +$arg2 = "2nd";
>> +brokenTrace("1st", $arg2, "3th", "4th");
>> function backtraceWrapper(){
>> - $bt = debug_backtrace();
>> - var_dump($bt[1]['args']);
>> + $bt = debug_backtrace();
>> + var_dump($bt[1]['args']);
>> }
>> ?>
>> --EXPECT--
>> @@ -22,6 +27,16 @@ array(4) {
>> [0]=>
>> string(3) "1st"
>> [1]=>
>> + &string(3) "2nd"
>> + [2]=>
>> + string(3) "3th"
>> + [3]=>
>> + string(3) "4th"
>> +}
>> +array(4) {
>> + [0]=>
>> + string(3) "1st"
>> + [1]=>
>> string(3) "2nd"
>> [2]=>
>> string(3) "3th"
>> @@ -32,12 +47,26 @@ 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]=>
>> string(3) "4th"
>> }
>> array(2) {
>> [0]=>
>> + &string(3) "2nd"
>> + [1]=>
>> + string(3) "4th"
>> +}
>> +array(2) {
>> + [0]=>
>> string(3) "2nd"
>> [1]=>
>> string(3) "4th"
>> @@ -46,3 +75,7 @@ array(1) {
>> [0]=>
>> string(3) "4th"
>> }
>> +array(1) {
>> + [0]=>
>> + string(3) "4th"
>> +}
>> diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
>> index b0e4f6a..3bdc94d 100644
>> --- a/Zend/zend_builtin_functions.c
>> +++ b/Zend/zend_builtin_functions.c
>> @@ -502,9 +502,13 @@ ZEND_FUNCTION(func_get_args)
>> if (arg_count > first_extra_arg) {
>> while (i < first_extra_arg) {
>> q = p;
>> - ZVAL_DEREF(q);
>> - if (Z_OPT_REFCOUNTED_P(q))
>> Z_ADDREF_P(q);
>> - ZEND_HASH_FILL_ADD(q);
>> + if (EXPECTED(Z_TYPE_INFO_P(q) !=
>> IS_UNDEF)) {
>> + ZVAL_DEREF(q);
>> + if (Z_OPT_REFCOUNTED_P(q))
>> {
>> + Z_ADDREF_P(q);
>> + }
>> + ZEND_HASH_FILL_ADD(q);
>> + }
>> p++;
>> i++;
>> }
>> @@ -512,9 +516,13 @@ ZEND_FUNCTION(func_get_args)
>> }
>> while (i < arg_count) {
>> q = p;
>> - ZVAL_DEREF(q);
>> - if (Z_OPT_REFCOUNTED_P(q)) Z_ADDREF_P(q);
>> - ZEND_HASH_FILL_ADD(q);
>> + if (EXPECTED(Z_TYPE_INFO_P(q) !=
>> IS_UNDEF)) {
>> + ZVAL_DEREF(q);
>> + if (Z_OPT_REFCOUNTED_P(q)) {
>> + Z_ADDREF_P(q);
>> + }
>> + ZEND_HASH_FILL_ADD(q);
>> + }
>> p++;
>> i++;
>> }
>> @@ -2233,7 +2241,7 @@ static void
>> debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
>>
>> if (ZEND_CALL_NUM_ARGS(call) >
>> first_extra_arg) {
>> while (i < first_extra_arg) {
>> - if (Z_TYPE_INFO_P(p) !=
>> IS_UNDEF) {
>> + if
>> (EXPECTED(Z_TYPE_INFO_P(p) != IS_UNDEF)) {
>> if
>> (Z_OPT_REFCOUNTED_P(p)) {
>>
>> Z_ADDREF_P(p);
>> }
>> @@ -2247,7 +2255,7 @@ static void
>> debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
>> }
>>
>> while (i < num_args) {
>> - if (Z_TYPE_INFO_P(p) != IS_UNDEF) {
>> + if (EXPECTED(Z_TYPE_INFO_P(p) !=
>> IS_UNDEF)) {
>> if (Z_OPT_REFCOUNTED_P(p)) {
>> Z_ADDREF_P(p);
>> }
>>
>>
>> --
>> PHP CVS Mailing List (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
> Shouldn't we keep the previous array indices though? Now func_get_arg($n)
> and func_get_args()[$n] may return different arguments, if I understood it
> correctly.
yeah, you are right. definitely we should keep the indices...
I will fix it. :)
thanks
>
> Nikita
--
Xinchen Hui
@Laruence
http://www.laruence.com/