From ad22f26e0def23a3f3132f87915eb3b0f4442a33 Mon Sep 17 00:00:00 2001 From: Adam Sotona Date: Thu, 31 Aug 2023 12:55:32 +0200 Subject: [PATCH] 8313258: RuntimeInvisibleTypeAnnotationsAttribute.annotations() API Index out of Bound error --- .../classes/jdk/internal/classfile/impl/CodeImpl.java | 3 +++ test/jdk/jdk/classfile/LimitsTest.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java index bc597acf07d1b..c3b6cded50ff9 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java @@ -97,6 +97,9 @@ public void setLabelTarget(Label label, int bci) { @Override public Label getLabel(int bci) { + if (bci < 0 || bci > codeLength) + throw new IllegalArgumentException(String.format("Bytecode offset out of range; bci=%d, codeLength=%d", + bci, codeLength)); if (labels == null) labels = new LabelImpl[codeLength + 1]; LabelImpl l = labels[bci]; diff --git a/test/jdk/jdk/classfile/LimitsTest.java b/test/jdk/jdk/classfile/LimitsTest.java index aa7f88240f576..b876b78a1253b 100644 --- a/test/jdk/jdk/classfile/LimitsTest.java +++ b/test/jdk/jdk/classfile/LimitsTest.java @@ -32,6 +32,7 @@ import java.lang.constant.ConstantDescs; import java.lang.constant.MethodTypeDesc; import jdk.internal.classfile.Classfile; +import jdk.internal.classfile.impl.LabelContext; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -71,4 +72,13 @@ void testEmptyCode() { assertThrows(IllegalArgumentException.class, () -> Classfile.of().build(ClassDesc.of("EmptyClass"), cb -> cb.withMethodBody( "emptyMethod", MethodTypeDesc.of(ConstantDescs.CD_void), 0, cob -> {}))); } + + @Test + void testCodeRange() { + var cf = Classfile.of(); + var lc = (LabelContext)cf.parse(cf.build(ClassDesc.of("EmptyClass"), cb -> cb.withMethodBody( + "aMethod", MethodTypeDesc.of(ConstantDescs.CD_void), 0, cob -> cob.return_()))).methods().get(0).code().get(); + assertThrows(IllegalArgumentException.class, () -> lc.getLabel(-1)); + assertThrows(IllegalArgumentException.class, () -> lc.getLabel(10)); + } }