Index: enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp =================================================================== --- enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp (revision 429355) +++ enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp (working copy) @@ -5033,7 +5033,7 @@ unsigned short handler_cp_index; method_get_exc_handler_info( ctex->m_method, (unsigned short)index, &start_pc, &end_pc, &handler_pc, &handler_cp_index ); - if( ( start_pc >= len ) || ( end_pc >= len ) || ( handler_pc >= len ) ) + if( ( start_pc >= len ) || ( end_pc > len ) || ( handler_pc >= len ) ) { VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) << ", method: " << method_get_name( ctex->m_method ) @@ -5047,13 +5047,15 @@ CHECK_HANDLER_CONST_POOL_CLASS( ctex, handler_cp_index ); // check instruction relations if( (codeInstr[ start_pc ].m_instr == 0) - || (codeInstr[ end_pc ].m_instr == 0) + || (end_pc < len && codeInstr[ end_pc ].m_instr == 0) || (codeInstr[ handler_pc ].m_instr == 0) ) { VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) - << ", method: " << method_get_name( ctex->m_method ) - << method_get_descriptor( ctex->m_method ) - << ") Handler pc is out of instruction set" ); + << ", method: " << method_get_name( ctex->m_method ) + << method_get_descriptor( ctex->m_method ) + << ") Handler pc is out of instruction set" << + " start_pc = " << start_pc << " end_pc = " << end_pc << + " handler_pc = " << handler_pc ); result = VER_ErrorHandler; goto labelEnd_vf_parse_bytecode; } @@ -5095,7 +5097,7 @@ for( count = start_pc + 1; count <= end_pc; count++ ) { if( codeInstr[count].m_mark ) { // calculate code instruction number - instr = codeInstr[count].m_instr - 1; + instr = count < end_pc ? codeInstr[count].m_instr - 1 : len; // check existen of handler array if( code[instr].m_handler == NULL ) { // create handler array for code instruction