hotspot/src/share/vm/classfile/verifier.cpp
changeset 41542 c705c10c4914
parent 40923 10fe1c28b9f6
child 46271 979ebd346ecf
child 43178 6fb98b21d035
--- a/hotspot/src/share/vm/classfile/verifier.cpp	Wed Jun 29 11:52:27 2016 -0400
+++ b/hotspot/src/share/vm/classfile/verifier.cpp	Thu Jun 30 08:11:30 2016 -0400
@@ -541,8 +541,19 @@
     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;
     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) {
+        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();