From e5bcd217f9bda7a2e3551f43017db3a558c74ff0 Mon Sep 17 00:00:00 2001 From: Katarzyna Marek Date: Fri, 2 Feb 2024 19:29:23 +0100 Subject: [PATCH] bugfix: fix stack overflow when invalid primitive --- .../using_directives/custom/Parser.java | 16 +++++++++++++--- .../using_directives/parser/ParserUnitTest.java | 7 +++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/virtuslab/using_directives/custom/Parser.java b/src/main/java/com/virtuslab/using_directives/custom/Parser.java index 98211b7..500415c 100644 --- a/src/main/java/com/virtuslab/using_directives/custom/Parser.java +++ b/src/main/java/com/virtuslab/using_directives/custom/Parser.java @@ -116,6 +116,9 @@ UsingDef usingDirective() { return null; } UsingValue value = value(offset + key.length()); + if (value == null) { + return null; + } return new UsingDef(key, value, source.getPositionFromOffset(offset)); } return null; @@ -141,7 +144,10 @@ UsingValue value(int keyEnd) { boolean isAfterLineEnd = in.td.isAfterLineEnd(); UsingPrimitive p = primitive(keyEnd); - if (isAfterLineEnd) { + if (p == null) { + error(String.format("Invalid primitive: %s", in.td.token.str)); + return null; + } else if (isAfterLineEnd) { return new EmptyLiteral(source.getPositionFromOffset(keyEnd)); } else if (in.td.token != Tokens.EOF && !(in.td.isAfterLineEnd())) { int commaIndex = in.td.offset; @@ -150,7 +156,9 @@ UsingValue value(int keyEnd) { in.nextToken(); } UsingValue rest = value(commaIndex); - if (rest instanceof UsingPrimitive) { + if (rest == null) { + return null; + } else if (rest instanceof UsingPrimitive) { ArrayList res = new ArrayList<>(); res.add(p); if (!(rest instanceof EmptyLiteral)) { @@ -181,8 +189,10 @@ UsingPrimitive primitive(int keyEnd) { } else if (in.td.token == Tokens.FALSE) { res = new BooleanLiteral(false, source.getPositionFromOffset(offset)); in.nextToken(); - } else { + } else if (in.td.token == Tokens.COMMA || in.td.token == Tokens.EOF || in.td.isAfterLineEnd()) { res = new EmptyLiteral(source.getPositionFromOffset(keyEnd)); + } else { + res = null; } return res; } diff --git a/src/test/java/com/virtuslab/using_directives/parser/ParserUnitTest.java b/src/test/java/com/virtuslab/using_directives/parser/ParserUnitTest.java index b65c9b2..bf32d52 100644 --- a/src/test/java/com/virtuslab/using_directives/parser/ParserUnitTest.java +++ b/src/test/java/com/virtuslab/using_directives/parser/ParserUnitTest.java @@ -157,4 +157,11 @@ public void testSkipMultilineComment() { assertDiagnostic( reporter, 1, 8, "Expected new line after the using directive, in the line; but found"); } + + @Test + public void testInvalidPrimitive() { + String input = "using dep com.lihaoyi :: fastparse : 3.0.2"; + PersistentReporter reporter = reporterAfterParsing(input); + assertDiagnostic(reporter, 0, 35, "Invalid primitive: :"); + } }