]> granicus.if.org Git - php/commitdiff
Fixed cleanup of incompleytely passed parameters
authorDmitry Stogov <dmitry@zend.com>
Mon, 30 Jun 2014 11:41:16 +0000 (15:41 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 30 Jun 2014 11:41:16 +0000 (15:41 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 54a33fe1afbc361f3cb7b6d6608124a82d752b93..f0da4eeded0f0c28689facb80ce96aff0cc464cd 100644 (file)
@@ -2608,9 +2608,6 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
                }
        }
 
-//???
-       call->num_args += opline->extended_value;
-
        LOAD_OPLINE();
 
        if (UNEXPECTED(fbc->type == ZEND_INTERNAL_FUNCTION)) {
@@ -2978,6 +2975,7 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
 
        value = GET_OP1_ZVAL_PTR(BP_VAR_R);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        ZVAL_COPY_VALUE(arg, value);
        if (OP1_TYPE == IS_CONST) {
                if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -2995,6 +2993,7 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
 
        varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));
                FREE_OP1();
@@ -3037,6 +3036,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
                        Z_ADDREF_P(varptr);
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY_VALUE(arg, varptr);
        } else {
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -3045,6 +3045,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
                        zend_error(E_STRICT, "Only variables should be passed by reference");
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY(arg, varptr);
                FREE_OP1_IF_VAR();
        }
@@ -3066,6 +3067,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, ANY)
        }
 
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (OP1_TYPE == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
                ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
                ZEND_VM_NEXT_OPCODE();
@@ -3102,6 +3104,7 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR, VAR|CV, ANY)
 
        varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));
                FREE_OP1();
@@ -3123,7 +3126,7 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
        SAVE_OPLINE();
 
        args = GET_OP1_ZVAL_PTR(BP_VAR_R);
-       arg_num = opline->op2.num + EX(call)->num_args + 1;
+       arg_num = EX(call)->num_args + 1;
 
 ZEND_VM_C_LABEL(send_again):
        switch (Z_TYPE_P(args)) {
index 6f87261b5509171fc415676431b58b32f810aff7..3f373a1a9807d98d92943787a7d52dbccdb4616b 100644 (file)
@@ -560,9 +560,6 @@ static int ZEND_FASTCALL  ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
 
-//???
-       call->num_args += opline->extended_value;
-
        LOAD_OPLINE();
 
        if (UNEXPECTED(fbc->type == ZEND_INTERNAL_FUNCTION)) {
@@ -753,7 +750,7 @@ static int ZEND_FASTCALL  ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        SAVE_OPLINE();
 
        args = get_zval_ptr(opline->op1_type, &opline->op1, execute_data, &free_op1, BP_VAR_R);
-       arg_num = opline->op2.num + EX(call)->num_args + 1;
+       arg_num = EX(call)->num_args + 1;
 
 send_again:
        switch (Z_TYPE_P(args)) {
@@ -2640,6 +2637,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
 
        value = opline->op1.zv;
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        ZVAL_COPY_VALUE(arg, value);
        if (IS_CONST == IS_CONST) {
                if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -7831,6 +7829,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
        value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        ZVAL_COPY_VALUE(arg, value);
        if (IS_TMP_VAR == IS_CONST) {
                if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -12966,6 +12965,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR
 
        varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));
                zval_ptr_dtor_nogc(free_op1.var);
@@ -13008,6 +13008,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                        Z_ADDREF_P(varptr);
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY_VALUE(arg, varptr);
        } else {
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -13016,6 +13017,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                        zend_error(E_STRICT, "Only variables should be passed by reference");
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY(arg, varptr);
                zval_ptr_dtor_nogc(free_op1.var);
        }
@@ -13037,6 +13039,7 @@ static int ZEND_FASTCALL  ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        }
 
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (IS_VAR == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
                ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
                ZEND_VM_NEXT_OPCODE();
@@ -13073,6 +13076,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
 
        varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));
                zval_ptr_dtor_nogc(free_op1.var);
@@ -30108,6 +30112,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
 
        varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));
 
@@ -30150,6 +30155,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                        Z_ADDREF_P(varptr);
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY_VALUE(arg, varptr);
        } else {
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -30158,6 +30164,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                        zend_error(E_STRICT, "Only variables should be passed by reference");
                }
                arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+               EX(call)->num_args = opline->op2.num;
                ZVAL_COPY(arg, varptr);
 
        }
@@ -30179,6 +30186,7 @@ static int ZEND_FASTCALL  ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        }
 
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (IS_CV == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
                ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
                ZEND_VM_NEXT_OPCODE();
@@ -30214,6 +30222,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
 
        varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
        arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
+       EX(call)->num_args = opline->op2.num;
        if (Z_ISREF_P(varptr)) {
                ZVAL_COPY(arg, Z_REFVAL_P(varptr));