diff --git a/src/java.base/share/classes/java/lang/classfile/Signature.java b/src/java.base/share/classes/java/lang/classfile/Signature.java index eef86d5a7a1..f9af71083f9 100644 --- a/src/java.base/share/classes/java/lang/classfile/Signature.java +++ b/src/java.base/share/classes/java/lang/classfile/Signature.java @@ -417,15 +417,18 @@ public sealed interface Signature { * {@return a signature for an array type} * @param dims the dimension of the array * @param componentSignature the component type - * @throws IllegalArgumentException if the resulting array type exceeds - * 255 dimensions + * @throws IllegalArgumentException if {@code dims < 1} or the + * resulting array type exceeds 255 dimensions */ public static ArrayTypeSig of(int dims, Signature componentSignature) { requireNonNull(componentSignature); + if (componentSignature instanceof SignaturesImpl.ArrayTypeSigImpl arr) { + if (dims < 1 || dims > 255 - arr.arrayDepth()) + throw new IllegalArgumentException("illegal array depth value"); + return new SignaturesImpl.ArrayTypeSigImpl(dims + arr.arrayDepth(), arr.elemType()); + } if (dims < 1 || dims > 255) throw new IllegalArgumentException("illegal array depth value"); - if (componentSignature instanceof SignaturesImpl.ArrayTypeSigImpl arr) - return new SignaturesImpl.ArrayTypeSigImpl(dims + arr.arrayDepth(), arr.elemType()); return new SignaturesImpl.ArrayTypeSigImpl(dims, componentSignature); } } diff --git a/test/jdk/jdk/classfile/SignaturesTest.java b/test/jdk/jdk/classfile/SignaturesTest.java index 4bba69735da..692db1dbb29 100644 --- a/test/jdk/jdk/classfile/SignaturesTest.java +++ b/test/jdk/jdk/classfile/SignaturesTest.java @@ -24,7 +24,7 @@ /* * @test * @summary Testing Signatures. - * @bug 8321540 8319463 + * @bug 8321540 8319463 8357955 * @run junit SignaturesTest */ import java.io.IOException; @@ -300,6 +300,20 @@ class SignaturesTest { """.lines().forEach(assertThrows(MethodSignature::parseFrom)); } + @Test + void testArraySignatureLimits() { + var sig = Signature.parseFrom("I"); + var arrSig = Signature.parseFrom("[I"); + for (int dim : List.of(256, -1, 0)) + Assertions.assertThrows(IllegalArgumentException.class, () -> Signature.ArrayTypeSig.of(dim, sig)); + for (int dim : List.of(255, -1, 0)) + Assertions.assertThrows(IllegalArgumentException.class, () -> Signature.ArrayTypeSig.of(dim, arrSig)); + for (int dim : List.of(255, 1)) + Signature.ArrayTypeSig.of(dim, sig); + for (int dim : List.of(254, 1)) + Signature.ArrayTypeSig.of(dim, arrSig); + } + private Consumer assertThrows(Function parser) { return s -> Assertions.assertThrows(IllegalArgumentException.class, () -> parser.apply(s), s); }