# HG changeset patch # User coleenp # Date 1467215519 14400 # Node ID aaab73f0c4d82cfca7b795532dd840462cd0d97f # Parent eb6d80cff6c7e2d54ef4d2ee9d3ca10dddcbbf32 8159515: Improve indy validation Reviewed-by: jrose, hseigel, vlivanov, bmoloden, ctornqvi, mschoene diff -r eb6d80cff6c7 -r aaab73f0c4d8 jdk/src/java.base/share/native/libverify/check_code.c --- a/jdk/src/java.base/share/native/libverify/check_code.c Tue Jun 28 11:37:04 2016 -0700 +++ b/jdk/src/java.base/share/native/libverify/check_code.c Wed Jun 29 11:51:59 2016 -0400 @@ -1293,14 +1293,13 @@ 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 @@ ? (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 @@ 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 @@ 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 @@ "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 @@ case JVM_OPC_invokevirtual: case JVM_OPC_invokespecial: case JVM_OPC_invokeinit: /* invokespecial call to */ - 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 @@ 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 @@ 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 @@ 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 @@ 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;