You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/11/22 12:52:42 UTC

[commons-bcel] 08/11: org.apache.bcel.classfile.StackMap constructors now throw ClassFormatException on invalid input

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-bcel.git

commit 939f0eba29d3308871adc2948a6ece803c93eece
Author: Gary David Gregory (Code signing key) <gg...@apache.org>
AuthorDate: Tue Nov 22 07:45:43 2022 -0500

    org.apache.bcel.classfile.StackMap constructors now throw
    ClassFormatException on invalid input
---
 src/main/java/org/apache/bcel/classfile/StackMap.java   | 10 ++++++----
 .../java/org/apache/bcel/classfile/StackMapEntry.java   | 17 +++++++----------
 .../java/org/apache/bcel/classfile/StackMapType.java    |  2 ++
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java
index 30f38034..80f2d2a7 100644
--- a/src/main/java/org/apache/bcel/classfile/StackMap.java
+++ b/src/main/java/org/apache/bcel/classfile/StackMap.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.Arrays;
 
 import org.apache.bcel.Const;
+import org.apache.bcel.util.Args;
 
 /**
  * This class represents a stack map attribute used for preverification of Java classes for the
@@ -73,9 +74,10 @@ public final class StackMap extends Attribute {
      *
      * @param constantPool Array of constants
      */
-    public StackMap(final int nameIndex, final int length, final StackMapEntry[] map, final ConstantPool constantPool) {
+    public StackMap(final int nameIndex, final int length, final StackMapEntry[] table, final ConstantPool constantPool) {
         super(Const.ATTR_STACK_MAP, nameIndex, length, constantPool);
-        this.table = map;
+        this.table = table != null ? table : StackMapEntry.EMPTY_ARRAY;
+        Args.requireU2(this.table.length, "table.length");
     }
 
     /**
@@ -117,7 +119,7 @@ public final class StackMap extends Attribute {
     }
 
     public int getMapLength() {
-        return table == null ? 0 : table.length;
+        return table.length;
     }
 
     /**
@@ -131,7 +133,7 @@ public final class StackMap extends Attribute {
      * @param table Array of stack map entries
      */
     public void setStackMap(final StackMapEntry[] table) {
-        this.table = table;
+        this.table = table != null ? table : StackMapEntry.EMPTY_ARRAY;
         int len = 2; // Length of 'number_of_entries' field prior to the array of stack maps
         for (final StackMapEntry element : table) {
             len += element.getMapEntrySize();
diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java
index 9da003db..0eed5838 100644
--- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java
+++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java
@@ -46,10 +46,7 @@ import org.apache.bcel.Const;
  */
 public final class StackMapEntry implements Node, Cloneable {
 
-    /**
-     * Empty array.
-     */
-    private static final StackMapType[] EMPTY_STACK_MAP_TYPE_ARRAY = {};
+    static final StackMapEntry[] EMPTY_ARRAY = {};
 
     private int frameType;
     private int byteCodeOffset;
@@ -118,8 +115,8 @@ public final class StackMapEntry implements Node, Cloneable {
     public StackMapEntry(final int byteCodeOffset, final int numberOfLocals, final StackMapType[] typesOfLocals, final int numberOfStackItems,
         final StackMapType[] typesOfStackItems, final ConstantPool constantPool) {
         this.byteCodeOffset = byteCodeOffset;
-        this.typesOfLocals = typesOfLocals != null ? typesOfLocals : EMPTY_STACK_MAP_TYPE_ARRAY;
-        this.typesOfStackItems = typesOfStackItems != null ? typesOfStackItems : EMPTY_STACK_MAP_TYPE_ARRAY;
+        this.typesOfLocals = typesOfLocals != null ? typesOfLocals : StackMapType.EMPTY_ARRAY;
+        this.typesOfStackItems = typesOfStackItems != null ? typesOfStackItems : StackMapType.EMPTY_ARRAY;
         this.constantPool = constantPool;
         if (numberOfLocals < 0) {
             throw new IllegalArgumentException("numberOfLocals < 0");
@@ -142,8 +139,8 @@ public final class StackMapEntry implements Node, Cloneable {
         final ConstantPool constantPool) {
         this.frameType = tag;
         this.byteCodeOffset = byteCodeOffset;
-        this.typesOfLocals = typesOfLocals != null ? typesOfLocals : EMPTY_STACK_MAP_TYPE_ARRAY;
-        this.typesOfStackItems = typesOfStackItems != null ? typesOfStackItems : EMPTY_STACK_MAP_TYPE_ARRAY;
+        this.typesOfLocals = typesOfLocals != null ? typesOfLocals : StackMapType.EMPTY_ARRAY;
+        this.typesOfStackItems = typesOfStackItems != null ? typesOfStackItems : StackMapType.EMPTY_ARRAY;
         this.constantPool = constantPool;
     }
 
@@ -350,11 +347,11 @@ public final class StackMapEntry implements Node, Cloneable {
     }
 
     public void setTypesOfLocals(final StackMapType[] types) {
-        typesOfLocals = types != null ? types : EMPTY_STACK_MAP_TYPE_ARRAY;
+        typesOfLocals = types != null ? types : StackMapType.EMPTY_ARRAY;
     }
 
     public void setTypesOfStackItems(final StackMapType[] types) {
-        typesOfStackItems = types != null ? types : EMPTY_STACK_MAP_TYPE_ARRAY;
+        typesOfStackItems = types != null ? types : StackMapType.EMPTY_ARRAY;
     }
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java
index 438fa5df..c9d6fdc4 100644
--- a/src/main/java/org/apache/bcel/classfile/StackMapType.java
+++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java
@@ -31,6 +31,8 @@ import org.apache.bcel.Const;
  */
 public final class StackMapType implements Cloneable {
 
+    static final StackMapType[] EMPTY_ARRAY = {};
+
     private byte type;
     private int index = -1; // Index to CONSTANT_Class or offset
     private ConstantPool constantPool;