Mercurial > hg > truffle
comparison src/share/vm/classfile/verifier.cpp @ 8816:729be16a470b
8010667: Non-zero padding is not allowed in splitverifier for tableswitch/lookupswitch instructions.
Summary: Don't check the padding bits if class file version is >= 51.
Reviewed-by: kvn, dholmes, coleenp
author | hseigel |
---|---|
date | Mon, 25 Mar 2013 08:37:28 -0400 |
parents | 3a531d40ad93 |
children | b8deb3205b51 |
comparison
equal
deleted
inserted
replaced
8815:9c8e53c7bed0 | 8816:729be16a470b |
---|---|
59 #endif | 59 #endif |
60 #ifdef TARGET_ARCH_ppc | 60 #ifdef TARGET_ARCH_ppc |
61 # include "bytes_ppc.hpp" | 61 # include "bytes_ppc.hpp" |
62 #endif | 62 #endif |
63 | 63 |
64 #define NOFAILOVER_MAJOR_VERSION 51 | 64 #define NOFAILOVER_MAJOR_VERSION 51 |
65 #define STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION 52 | 65 #define NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION 51 |
66 #define STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION 52 | |
66 | 67 |
67 // Access to external entry for VerifyClassCodes - old byte code verifier | 68 // Access to external entry for VerifyClassCodes - old byte code verifier |
68 | 69 |
69 extern "C" { | 70 extern "C" { |
70 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint); | 71 typedef jboolean (*verify_byte_codes_fn_t)(JNIEnv *, jclass, char *, jint); |
2025 StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) { | 2026 StackMapFrame* current_frame, StackMapTable* stackmap_table, TRAPS) { |
2026 int bci = bcs->bci(); | 2027 int bci = bcs->bci(); |
2027 address bcp = bcs->bcp(); | 2028 address bcp = bcs->bcp(); |
2028 address aligned_bcp = (address) round_to((intptr_t)(bcp + 1), jintSize); | 2029 address aligned_bcp = (address) round_to((intptr_t)(bcp + 1), jintSize); |
2029 | 2030 |
2030 // 4639449 & 4647081: padding bytes must be 0 | 2031 if (_klass->major_version() < NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION) { |
2031 u2 padding_offset = 1; | 2032 // 4639449 & 4647081: padding bytes must be 0 |
2032 while ((bcp + padding_offset) < aligned_bcp) { | 2033 u2 padding_offset = 1; |
2033 if(*(bcp + padding_offset) != 0) { | 2034 while ((bcp + padding_offset) < aligned_bcp) { |
2034 verify_error(ErrorContext::bad_code(bci), | 2035 if(*(bcp + padding_offset) != 0) { |
2035 "Nonzero padding byte in lookswitch or tableswitch"); | 2036 verify_error(ErrorContext::bad_code(bci), |
2036 return; | 2037 "Nonzero padding byte in lookswitch or tableswitch"); |
2037 } | 2038 return; |
2038 padding_offset++; | 2039 } |
2039 } | 2040 padding_offset++; |
2041 } | |
2042 } | |
2043 | |
2040 int default_offset = (int) Bytes::get_Java_u4(aligned_bcp); | 2044 int default_offset = (int) Bytes::get_Java_u4(aligned_bcp); |
2041 int keys, delta; | 2045 int keys, delta; |
2042 current_frame->pop_stack( | 2046 current_frame->pop_stack( |
2043 VerificationType::integer_type(), CHECK_VERIFY(this)); | 2047 VerificationType::integer_type(), CHECK_VERIFY(this)); |
2044 if (bcs->raw_code() == Bytecodes::_tableswitch) { | 2048 if (bcs->raw_code() == Bytecodes::_tableswitch) { |