diff --git a/modules/parser/src/main/java/org/dhallj/parser/support/ParsingHelpers.java b/modules/parser/src/main/java/org/dhallj/parser/support/ParsingHelpers.java index cafba16b..c35d7515 100644 --- a/modules/parser/src/main/java/org/dhallj/parser/support/ParsingHelpers.java +++ b/modules/parser/src/main/java/org/dhallj/parser/support/ParsingHelpers.java @@ -161,6 +161,11 @@ static final Expr.Parsed makeTimeLiteral(Token token, Token timeZone) { boolean positive = timeZone.image.charAt(0) == '+'; int tzHour = Integer.parseInt(timeZone.image.substring(1, 3)); int tzMinute = Integer.parseInt(timeZone.image.substring(4, 6)); + + if (tzHour > 23 || tzMinute > 59) { + throw new ParsingFailure("Invalid temporal literal"); + } + int seconds = tzHour * 60 + tzMinute; value = positive ? seconds : -seconds; } else { @@ -212,6 +217,11 @@ static final Expr.Parsed makeDateTimeLiteral(Token token, Token timeZone) { boolean positive = timeZone.image.charAt(0) == '+'; int tzHour = Integer.parseInt(timeZone.image.substring(1, 3)); int tzMinute = Integer.parseInt(timeZone.image.substring(4, 6)); + + if (tzHour > 23 || tzMinute > 59) { + throw new ParsingFailure("Invalid temporal literal"); + } + int seconds = tzHour * 60 + tzMinute; value = positive ? seconds : -seconds; } else { diff --git a/tests/src/test/scala/org/dhallj/tests/MiscSuite.scala b/tests/src/test/scala/org/dhallj/tests/MiscSuite.scala index 50c53ea4..9cbcb2d5 100644 --- a/tests/src/test/scala/org/dhallj/tests/MiscSuite.scala +++ b/tests/src/test/scala/org/dhallj/tests/MiscSuite.scala @@ -40,16 +40,21 @@ class MiscSuite extends ScalaCheckSuite { val parts = asString.split("-") // We need a reasonable four-digit year. - val cleaned = if (parts(0).isEmpty) { - // If it's negative we just make something up. - "2021" + "-" + parts.drop(2).mkString("-") - } else if (parts(0).size != 4) { - // If it's not four digits we just make something up. - "1999" + "-" + parts.drop(1).mkString("-") - } else { - asString - } + val cleaned = ( + if (parts(0).isEmpty) { + // If it's negative we just make something up. + "2021" + "-" + parts.drop(2).mkString("-") + } else if (parts(0).size != 4) { + // If it's not four digits we just make something up. + "1999" + "-" + parts.drop(1).mkString("-") + } else { + asString + } + // The ScalaCheck instance produces instants that can't be parsed. + ).replaceAll("-02-29", "-02-28") + val expected = Instant.parse(cleaned) + val result = Decode.decode(DhallParser.parse(cleaned).getEncodedBytes).toString // Keep it low-tech.