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 58916a50ab278004ca97dc63ba76ce0ee0de36f4 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Nov 19 09:17:02 2022 -0500 org.apache.bcel.classfile.StackMapEntry.StackMapEntry(DataInput, ConstantPool) reads signed instead of unsigned shorts from its DataInput. --- src/changes/changes.xml | 1 + .../java/org/apache/bcel/classfile/StackMapEntry.java | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 52cca6d8..462d059c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -87,6 +87,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="Gary Gregory">InstructionConstants.ALOAD_0 value is wrong (regression from 6.6.0).</action> <action type="fix" dev="ggregory" due-to="Gary Gregory">InstructionConstants.DCONST_0 value is wrong (regression from 6.6.0).</action> <action type="fix" dev="ggregory" due-to="Gary Gregory">Avoid internal NPE in org.apache.bcel.util.ClassPath.getInputStream(String, String).</action> + <action type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.bcel.classfile.StackMapEntry.StackMapEntry(DataInput, ConstantPool) reads signed instead of unsigned shorts from its DataInput.</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump spotbugs-maven-plugin from 4.7.2.2 to 4.7.3.0 #167.</action> <action type="update" dev="ggregory" due-to="Dependabot">Bump jmh.version from 1.35 to 1.36 #170.</action> diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index c23d27c7..a0c305c5 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -26,7 +26,9 @@ import org.apache.bcel.Const; /** * This class represents a stack map entry recording the types of local variables and the of stack items at a given - * byte code offset. See CLDC specification 5.3.1.2 + * byte code offset. See CLDC specification 5.3.1.2. + * + * See also https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.4 * * @see StackMap * @see StackMapType @@ -59,27 +61,27 @@ public final class StackMapEntry implements Node, Cloneable { byteCodeOffset = frameType - Const.SAME_LOCALS_1_STACK_ITEM_FRAME; typesOfStackItems = new StackMapType[] { new StackMapType(dataInput, constantPool) }; } else if (frameType == Const.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - byteCodeOffset = dataInput.readShort(); + byteCodeOffset = dataInput.readUnsignedShort(); typesOfStackItems = new StackMapType[] { new StackMapType(dataInput, constantPool) }; } else if (frameType >= Const.CHOP_FRAME && frameType <= Const.CHOP_FRAME_MAX) { - byteCodeOffset = dataInput.readShort(); + byteCodeOffset = dataInput.readUnsignedShort(); } else if (frameType == Const.SAME_FRAME_EXTENDED) { - byteCodeOffset = dataInput.readShort(); + byteCodeOffset = dataInput.readUnsignedShort(); } else if (frameType >= Const.APPEND_FRAME && frameType <= Const.APPEND_FRAME_MAX) { - byteCodeOffset = dataInput.readShort(); + byteCodeOffset = dataInput.readUnsignedShort(); final int numberOfLocals = frameType - 251; typesOfLocals = new StackMapType[numberOfLocals]; for (int i = 0; i < numberOfLocals; i++) { typesOfLocals[i] = new StackMapType(dataInput, constantPool); } } else if (frameType == Const.FULL_FRAME) { - byteCodeOffset = dataInput.readShort(); - final int numberOfLocals = dataInput.readShort(); + byteCodeOffset = dataInput.readUnsignedShort(); + final int numberOfLocals = dataInput.readUnsignedShort(); typesOfLocals = new StackMapType[numberOfLocals]; for (int i = 0; i < numberOfLocals; i++) { typesOfLocals[i] = new StackMapType(dataInput, constantPool); } - final int numberOfStackItems = dataInput.readShort(); + final int numberOfStackItems = dataInput.readUnsignedShort(); typesOfStackItems = new StackMapType[numberOfStackItems]; for (int i = 0; i < numberOfStackItems; i++) { typesOfStackItems[i] = new StackMapType(dataInput, constantPool);