From ebd3766ac67c371c2b4f991e8253952f2c07868b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 11 Jul 2016 11:21:08 +0200 Subject: [PATCH] [java] fixes broken generic signature parsing (IDEA-158330) --- .../com/intellij/psi/impl/compiled/SignatureParsing.java | 7 +++++-- .../testSrc/com/intellij/psi/SignatureParsingTest.java | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java index 215b50a65720..de619887b92b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java @@ -98,15 +98,18 @@ public class SignatureParsing { } } - private static String parseTypeVariableRefSignature(CharacterIterator signature) { + private static String parseTypeVariableRefSignature(CharacterIterator signature) throws ClsFormatException { StringBuilder id = new StringBuilder(); signature.next(); - while (signature.current() != ';' && signature.current() != '>') { + while (signature.current() != ';' && signature.current() != '>' && signature.current() != CharacterIterator.DONE) { id.append(signature.current()); signature.next(); } + if (signature.current() == CharacterIterator.DONE) { + throw new ClsFormatException(); + } if (signature.current() == ';') { signature.next(); } diff --git a/java/java-tests/testSrc/com/intellij/psi/SignatureParsingTest.java b/java/java-tests/testSrc/com/intellij/psi/SignatureParsingTest.java index f885131bdc73..3b794b1161e1 100644 --- a/java/java-tests/testSrc/com/intellij/psi/SignatureParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/SignatureParsingTest.java @@ -41,6 +41,11 @@ public class SignatureParsingTest { assertEquals("p.Obj$.I", parseTypeString("Lp/Obj$$I;")); } + @Test(expected = ClsFormatException.class) + public void testIllegal() throws ClsFormatException { + parseTypeString("T"); + } + private static String parseTypeString(String signature) throws ClsFormatException { return SignatureParsing.parseTypeString(new StringCharacterIterator(signature), StubBuildingVisitor.GUESSING_MAPPER); }