From a772343c7b2dd7669b394a9d1ce46a154764c7d6 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Fri, 24 Jun 2022 10:03:02 -0400 Subject: [PATCH] Use the default float/double parser as fallback --- .../fasterxml/jackson/core/io/NumberInput.java | 18 ++++++++++++++++-- .../jackson/core/io/TestNumberInput.java | 9 +++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java b/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java index 754b4bf8f5..b382d90391 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java +++ b/src/main/java/com/fasterxml/jackson/core/io/NumberInput.java @@ -345,7 +345,14 @@ public static double parseDouble(final String s) throws NumberFormatException { * @since v2.14 */ public static double parseDouble(final String s, final boolean useFastParser) throws NumberFormatException { - return useFastParser ? FastDoubleParser.parseDouble(s) : Double.parseDouble(s); + if (useFastParser) { + try { + return FastDoubleParser.parseDouble(s); + } catch (NumberFormatException ignore) { + return Double.parseDouble(s); + } + } + return Double.parseDouble(s); } /** @@ -367,7 +374,14 @@ public static float parseFloat(final String s) throws NumberFormatException { * @since v2.14 */ public static float parseFloat(final String s, final boolean useFastParser) throws NumberFormatException { - return useFastParser ? FastFloatParser.parseFloat(s) : Float.parseFloat(s); + if (useFastParser) { + try { + return FastFloatParser.parseFloat(s); + } catch (NumberFormatException ignore) { + return Float.parseFloat(s); + } + } + return Float.parseFloat(s); } public static BigDecimal parseBigDecimal(String s) throws NumberFormatException { diff --git a/src/test/java/com/fasterxml/jackson/core/io/TestNumberInput.java b/src/test/java/com/fasterxml/jackson/core/io/TestNumberInput.java index bf1f80c247..fb94fa3283 100644 --- a/src/test/java/com/fasterxml/jackson/core/io/TestNumberInput.java +++ b/src/test/java/com/fasterxml/jackson/core/io/TestNumberInput.java @@ -24,5 +24,14 @@ public void testParseFloat() assertEquals("1.4E-45", Float.toString(NumberInput.parseFloat(exampleFloat2))); assertEquals("1.4E-45", Float.toString(NumberInput.parseFloat(exampleFloat2, true))); } + + public void testNastyAcceptedDoubleValues() { + final String[] nastyAcceptedDoubleValues = new String[]{"1.1e-23f", "0x.003p12f", "0x1.17742db862a4P-1d"}; + + for (String nastyAcceptedDouble : nastyAcceptedDoubleValues) { + assertEquals(Double.parseDouble(nastyAcceptedDouble), NumberInput.parseDouble(nastyAcceptedDouble)); + assertEquals(Double.parseDouble(nastyAcceptedDouble), NumberInput.parseDouble(nastyAcceptedDouble, true)); + } + } }