comparison src/share/vm/classfile/verifier.cpp @ 1560:e40a3601bc1f

6911922: JVM must throw VerifyError for jsr or jsr_w opcodes in class file v.51+ 6693236: A class file whose version number is greater than to 50.0 must be verified using the typechecker Summary: Disable failover verification for classfiles >= v51 Reviewed-by: never, acorn, dholmes
author kamg
date Wed, 19 May 2010 10:19:10 -0400
parents 4ce7240d622c
children dfe27f03244a
comparison
equal deleted inserted replaced
1536:892898e961c5 1560:e40a3601bc1f
23 */ 23 */
24 24
25 # include "incls/_precompiled.incl" 25 # include "incls/_precompiled.incl"
26 # include "incls/_verifier.cpp.incl" 26 # include "incls/_verifier.cpp.incl"
27 27
28 #define NOFAILOVER_MAJOR_VERSION 51
29
28 // Access to external entry for VerifyClassCodes - old byte code verifier 30 // Access to external entry for VerifyClassCodes - old byte code verifier
29 31
30 extern "C" { 32 extern "C" {
31 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint); 33 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint);
32 typedef jboolean (*verify_byte_codes_fn_new_t)(JNIEnv *, jclass, char *, jint, jint); 34 typedef jboolean (*verify_byte_codes_fn_new_t)(JNIEnv *, jclass, char *, jint, jint);
89 klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) { 91 klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
90 ClassVerifier split_verifier( 92 ClassVerifier split_verifier(
91 klass, message_buffer, message_buffer_len, THREAD); 93 klass, message_buffer, message_buffer_len, THREAD);
92 split_verifier.verify_class(THREAD); 94 split_verifier.verify_class(THREAD);
93 exception_name = split_verifier.result(); 95 exception_name = split_verifier.result();
94 if (FailOverToOldVerifier && !HAS_PENDING_EXCEPTION && 96 if (klass->major_version() < NOFAILOVER_MAJOR_VERSION &&
97 FailOverToOldVerifier && !HAS_PENDING_EXCEPTION &&
95 (exception_name == vmSymbols::java_lang_VerifyError() || 98 (exception_name == vmSymbols::java_lang_VerifyError() ||
96 exception_name == vmSymbols::java_lang_ClassFormatError())) { 99 exception_name == vmSymbols::java_lang_ClassFormatError())) {
97 if (TraceClassInitialization) { 100 if (TraceClassInitialization) {
98 tty->print_cr( 101 tty->print_cr(
99 "Fail over class verification to old verifier for: %s", klassName); 102 "Fail over class verification to old verifier for: %s", klassName);