8161218: Better bytecode loading
Reviewed-by: acorn, mschoene, ctornqvi
Contributed-by: harold.seigel@oracle.com
--- a/hotspot/src/share/vm/classfile/verifier.cpp Thu Jul 21 15:49:17 2016 -0400
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Tue Jul 26 08:23:25 2016 -0400
@@ -541,19 +541,13 @@
stack_map_frame* sm_frame = sm_table->entries();
streamIndentor si2(ss);
int current_offset = -1;
- // Subtract two from StackMapAttribute length because the length includes
- // two bytes for number of table entries.
- size_t sm_table_space = method->stackmap_data()->length() - 2;
+ address end_of_sm_table = (address)sm_table + method->stackmap_data()->length();
for (u2 i = 0; i < sm_table->number_of_entries(); ++i) {
ss->indent();
- size_t sm_frame_size = sm_frame->size();
- // If the size of the next stackmap exceeds the length of the entire
- // stackmap table then print a truncated message and return.
- if (sm_frame_size > sm_table_space) {
+ if (!sm_frame->verify((address)sm_frame, end_of_sm_table)) {
sm_frame->print_truncated(ss, current_offset);
return;
}
- sm_table_space -= sm_frame_size;
sm_frame->print_on(ss, current_offset);
ss->cr();
current_offset += sm_frame->offset_delta();