method->args_count should be used to get the size of arguments,
not nr_args(args_list). This bug led to stack overflow with the
following code:

public class Test {
    public void c(long x) {
    }

    public static void main(String[] args) {
        Test t = new Test();
        int x = 0;

        while (x == 0) t.c(1l);
    }
}

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/insn-selector_32.brg |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/arch/x86/insn-selector_32.brg b/arch/x86/insn-selector_32.brg
index 6c9840f..17ed19c 100644
--- a/arch/x86/insn-selector_32.brg
+++ b/arch/x86/insn-selector_32.brg
@@ -756,9 +756,8 @@ reg:        EXPR_INVOKEINTERFACE(arg) 1
        /* invoke method */
        select_insn(s, tree, reg_insn(INSN_CALL_REG, call_target));
 
-       args_count = nr_args(to_expr(expr->args_list));
-       if (args_count)
-               method_args_cleanup(s, tree, args_count);
+       if (method->args_count)
+               method_args_cleanup(s, tree, method->args_count);
 
        select_insn(s, tree, reg_reg_insn(INSN_MOV_REG_REG, eax, state->reg1));
        if (edx != NULL)
@@ -1962,6 +1961,7 @@ static void invokevirtual(struct _MBState *state, struct 
basic_block *s, struct
        struct var_info *call_target;
        unsigned long method_offset;
        unsigned long args_count;
+       struct vm_method *method;
 
        expr    = to_expr(tree);
        method_offset = expr_method_index(expr) * sizeof(void *);
@@ -1988,9 +1988,10 @@ static void invokevirtual(struct _MBState *state, struct 
basic_block *s, struct
        /* invoke method */
        select_insn(s, tree, reg_insn(INSN_CALL_REG, call_target));
 
-       args_count = nr_args(to_expr(expr->args_list));
-       if (args_count)
-               method_args_cleanup(s, tree, args_count);
+       method  = expr->target_method;
+
+       if (method->args_count)
+               method_args_cleanup(s, tree, method->args_count);
 }
 
 static void emit_code(struct basic_block *bb, MBState *state, int goal)
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to