8159515: Improve indy validation
Reviewed-by: jrose, hseigel, vlivanov, bmoloden, ctornqvi, mschoene
This commit is contained in:
parent
b9b8be2d7c
commit
3be6827c7c
@ -1293,14 +1293,13 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
|
||||
case JVM_OPC_invokevirtual:
|
||||
case JVM_OPC_invokespecial:
|
||||
case JVM_OPC_invokestatic:
|
||||
case JVM_OPC_invokedynamic:
|
||||
case JVM_OPC_invokeinterface: {
|
||||
/* Make sure the constant pool item is the right type. */
|
||||
int key = (code[offset + 1] << 8) + code[offset + 2];
|
||||
const char *methodname;
|
||||
jclass cb = context->class;
|
||||
fullinfo_type clazz_info;
|
||||
int is_constructor, is_internal, is_invokedynamic;
|
||||
int is_constructor, is_internal;
|
||||
int kind;
|
||||
|
||||
switch (opcode ) {
|
||||
@ -1309,9 +1308,6 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
|
||||
? (1 << JVM_CONSTANT_Methodref)
|
||||
: ((1 << JVM_CONSTANT_InterfaceMethodref) | (1 << JVM_CONSTANT_Methodref)));
|
||||
break;
|
||||
case JVM_OPC_invokedynamic:
|
||||
kind = 1 << JVM_CONSTANT_NameAndType;
|
||||
break;
|
||||
case JVM_OPC_invokeinterface:
|
||||
kind = 1 << JVM_CONSTANT_InterfaceMethodref;
|
||||
break;
|
||||
@ -1319,7 +1315,6 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
|
||||
kind = 1 << JVM_CONSTANT_Methodref;
|
||||
}
|
||||
|
||||
is_invokedynamic = opcode == JVM_OPC_invokedynamic;
|
||||
/* Make sure the constant pool item is the right type. */
|
||||
verify_constant_pool_type(context, key, kind);
|
||||
methodname = JVM_GetCPMethodNameUTF(env, cb, key);
|
||||
@ -1328,11 +1323,8 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
|
||||
is_internal = methodname[0] == '<';
|
||||
pop_and_free(context);
|
||||
|
||||
if (is_invokedynamic)
|
||||
clazz_info = context->object_info; // anything will do
|
||||
else
|
||||
clazz_info = cp_index_to_class_fullinfo(context, key,
|
||||
JVM_CONSTANT_Methodref);
|
||||
clazz_info = cp_index_to_class_fullinfo(context, key,
|
||||
JVM_CONSTANT_Methodref);
|
||||
this_idata->operand.i = key;
|
||||
this_idata->operand2.fi = clazz_info;
|
||||
if (is_constructor) {
|
||||
@ -1387,17 +1379,15 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
|
||||
"Fourth operand byte of invokeinterface must be zero");
|
||||
}
|
||||
pop_and_free(context);
|
||||
} else if (opcode == JVM_OPC_invokedynamic) {
|
||||
if (code[offset + 3] != 0 || code[offset + 4] != 0) {
|
||||
CCerror(context,
|
||||
"Third and fourth operand bytes of invokedynamic must be zero");
|
||||
}
|
||||
} else if (opcode == JVM_OPC_invokevirtual
|
||||
|| opcode == JVM_OPC_invokespecial)
|
||||
set_protected(context, inumber, key, opcode);
|
||||
break;
|
||||
}
|
||||
|
||||
case JVM_OPC_invokedynamic:
|
||||
CCerror(context,
|
||||
"invokedynamic bytecode is not supported in this class file version");
|
||||
|
||||
case JVM_OPC_instanceof:
|
||||
case JVM_OPC_checkcast:
|
||||
@ -2085,7 +2075,6 @@ pop_stack(context_type *context, unsigned int inumber, stack_info_type *new_stac
|
||||
|
||||
case JVM_OPC_invokevirtual: case JVM_OPC_invokespecial:
|
||||
case JVM_OPC_invokeinit: /* invokespecial call to <init> */
|
||||
case JVM_OPC_invokedynamic:
|
||||
case JVM_OPC_invokestatic: case JVM_OPC_invokeinterface: {
|
||||
/* The top stuff on the stack depends on the method signature */
|
||||
int operand = this_idata->operand.i;
|
||||
@ -2101,8 +2090,7 @@ pop_stack(context_type *context, unsigned int inumber, stack_info_type *new_stac
|
||||
print_formatted_methodname(context, operand);
|
||||
}
|
||||
#endif
|
||||
if (opcode != JVM_OPC_invokestatic &&
|
||||
opcode != JVM_OPC_invokedynamic)
|
||||
if (opcode != JVM_OPC_invokestatic)
|
||||
/* First, push the object */
|
||||
*ip++ = (opcode == JVM_OPC_invokeinit ? '@' : 'A');
|
||||
for (p = signature + 1; *p != JVM_SIGNATURE_ENDFUNC; ) {
|
||||
@ -2388,7 +2376,6 @@ pop_stack(context_type *context, unsigned int inumber, stack_info_type *new_stac
|
||||
|
||||
case JVM_OPC_invokevirtual: case JVM_OPC_invokespecial:
|
||||
case JVM_OPC_invokeinit:
|
||||
case JVM_OPC_invokedynamic:
|
||||
case JVM_OPC_invokeinterface: case JVM_OPC_invokestatic: {
|
||||
int operand = this_idata->operand.i;
|
||||
const char *signature =
|
||||
@ -2398,8 +2385,7 @@ pop_stack(context_type *context, unsigned int inumber, stack_info_type *new_stac
|
||||
int item;
|
||||
const char *p;
|
||||
check_and_push(context, signature, VM_STRING_UTF);
|
||||
if (opcode == JVM_OPC_invokestatic ||
|
||||
opcode == JVM_OPC_invokedynamic) {
|
||||
if (opcode == JVM_OPC_invokestatic) {
|
||||
item = 0;
|
||||
} else if (opcode == JVM_OPC_invokeinit) {
|
||||
fullinfo_type init_type = this_idata->operand2.fi;
|
||||
@ -2795,7 +2781,6 @@ push_stack(context_type *context, unsigned int inumber, stack_info_type *new_sta
|
||||
|
||||
case JVM_OPC_invokevirtual: case JVM_OPC_invokespecial:
|
||||
case JVM_OPC_invokeinit:
|
||||
case JVM_OPC_invokedynamic:
|
||||
case JVM_OPC_invokestatic: case JVM_OPC_invokeinterface: {
|
||||
/* Look to signature to determine correct result. */
|
||||
int operand = this_idata->operand.i;
|
||||
|
Loading…
x
Reference in New Issue
Block a user