From 9b94c8d18c83411425fc09af02f9b397912493b5 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 3 Mar 2003 23:25:52 +0000 Subject: [PATCH] verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end of bytecode. * verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end of bytecode. (handle_ret_insn): Fail if returning to jsr that appears at end of bytecode. From-SVN: r63744 --- libjava/ChangeLog | 7 +++++++ libjava/verify.cc | 25 +++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index aaa9512761a..b799649016f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2003-03-03 Tom Tromey + + * verify.cc (handle_jsr_insn): Don't fail if `jsr' appears at end + of bytecode. + (handle_ret_insn): Fail if returning to jsr that appears at end of + bytecode. + 2003-03-03 Michael Koch * Makefile.am diff --git a/libjava/verify.cc b/libjava/verify.cc index dcb003dfb22..8f8c1df9eb1 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -1526,6 +1526,12 @@ private: for (subr_info *subr = jsr_ptrs[csub]; subr != NULL; subr = subr->next) { + // We might be returning to a `jsr' that is at the end of the + // bytecode. This is ok if we never return from the called + // subroutine, but if we see this here it is an error. + if (subr->pc >= current_method->code_length) + verify_fail ("fell off end"); + // Temporarily modify the current state so it looks like we're // in the enclosing context. current_state->subroutine = get_subroutine (subr->pc); @@ -1575,16 +1581,15 @@ private: // the local variable state across the jsr, but the subroutine // might change the stack depth, so we can't make any assumptions // about it. So we have yet another special case. We know that - // at this point PC points to the instruction after the jsr. - - // FIXME: what if we have a jsr at the end of the code, but that - // jsr has no corresponding ret? Is this verifiable, or is it - // not? If it is then we need a special case here. - if (PC >= current_method->code_length) - verify_fail ("fell off end"); - - current_state->stacktop = state::NO_STACK; - push_jump_merge (PC, current_state); + // at this point PC points to the instruction after the jsr. Note + // that it is ok to have a `jsr' at the end of the bytecode, + // provided that the called subroutine never returns. So, we have + // a special case here and another one when we handle the ret. + if (PC < current_method->code_length) + { + current_state->stacktop = state::NO_STACK; + push_jump_merge (PC, current_state); + } invalidate_pc (); } -- 2.30.2