@@ -395,7 +395,8 @@ static jboolean is_superclass(context_type *, fullinfo_type);
395395
396396static void initialize_exception_table (context_type * );
397397static int instruction_length (unsigned char * iptr , unsigned char * end );
398- static jboolean isLegalTarget (context_type * , int offset );
398+ static jboolean isLegalOffset (context_type * , int bci , int offset );
399+ static jboolean isLegalTarget (context_type * , int target );
399400static void verify_constant_pool_type (context_type * , int , unsigned );
400401
401402static void initialize_dataflow (context_type * );
@@ -1154,9 +1155,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
11541155 case JVM_OPC_goto : {
11551156 /* Set the ->operand to be the instruction number of the target. */
11561157 int jump = (((signed char )(code [offset + 1 ])) << 8 ) + code [offset + 2 ];
1157- int target = offset + jump ;
1158- if (!isLegalTarget (context , target ))
1158+ if (!isLegalOffset (context , offset , jump ))
11591159 CCerror (context , "Illegal target of jump or branch" );
1160+ int target = offset + jump ;
11601161 this_idata -> operand .i = code_data [target ];
11611162 break ;
11621163 }
@@ -1170,9 +1171,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
11701171 int jump = (((signed char )(code [offset + 1 ])) << 24 ) +
11711172 (code [offset + 2 ] << 16 ) + (code [offset + 3 ] << 8 ) +
11721173 (code [offset + 4 ]);
1173- int target = offset + jump ;
1174- if (!isLegalTarget (context , target ))
1174+ if (!isLegalOffset (context , offset , jump ))
11751175 CCerror (context , "Illegal target of jump or branch" );
1176+ int target = offset + jump ;
11761177 this_idata -> operand .i = code_data [target ];
11771178 break ;
11781179 }
@@ -1211,13 +1212,16 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
12111212 }
12121213 }
12131214 saved_operand = NEW (int , keys + 2 );
1214- if (!isLegalTarget (context , offset + _ck_ntohl (lpc [0 ])))
1215+ int jump = _ck_ntohl (lpc [0 ]);
1216+ if (!isLegalOffset (context , offset , jump ))
12151217 CCerror (context , "Illegal default target in switch" );
1216- saved_operand [keys + 1 ] = code_data [offset + _ck_ntohl (lpc [0 ])];
1218+ int target = offset + jump ;
1219+ saved_operand [keys + 1 ] = code_data [target ];
12171220 for (k = keys , lptr = & lpc [3 ]; -- k >= 0 ; lptr += delta ) {
1218- int target = offset + _ck_ntohl (lptr [0 ]);
1219- if (!isLegalTarget (context , target ))
1221+ jump = _ck_ntohl (lptr [0 ]);
1222+ if (!isLegalOffset (context , offset , jump ))
12201223 CCerror (context , "Illegal branch in tableswitch" );
1224+ target = offset + jump ;
12211225 saved_operand [k + 1 ] = code_data [target ];
12221226 }
12231227 saved_operand [0 ] = keys + 1 ; /* number of successors */
@@ -1746,11 +1750,24 @@ static int instruction_length(unsigned char *iptr, unsigned char *end)
17461750
17471751/* Given the target of a branch, make sure that it's a legal target. */
17481752static jboolean
1749- isLegalTarget (context_type * context , int offset )
1753+ isLegalTarget (context_type * context , int target )
1754+ {
1755+ int code_length = context -> code_length ;
1756+ int * code_data = context -> code_data ;
1757+ return (target >= 0 && target < code_length && code_data [target ] >= 0 );
1758+ }
1759+
1760+ /* Given a bci and offset, make sure the offset is valid and the target is legal */
1761+ static jboolean
1762+ isLegalOffset (context_type * context , int bci , int offset )
17501763{
17511764 int code_length = context -> code_length ;
17521765 int * code_data = context -> code_data ;
1753- return (offset >= 0 && offset < code_length && code_data [offset ] >= 0 );
1766+ int max_offset = 65535 ; // JVMS 4.11
1767+ int min_offset = -65535 ;
1768+ if (offset < min_offset || offset > max_offset ) return JNI_FALSE ;
1769+ int target = bci + offset ;
1770+ return (target >= 0 && target < code_length && code_data [target ] >= 0 );
17541771}
17551772
17561773
0 commit comments