From 8740bdc5afd07cf62722907644f65411cc52fa1c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 30 Apr 2020 13:24:05 -0700 Subject: [PATCH] strconv: fix for parseFloatPrefix parseFloatPrefix accepts a string if it has a valid floating-point number as prefix. Make sure that "infi", "infin", ... etc. are accepted as valid numbers "inf" with suffix "i", "in", etc. This is important for parsing complex numbers such as "0+infi". This change does not affect the correctness of ParseFloat because ParseFloat rejects strings that contain a suffix after a valid floating-point number. Updates #36771. Change-Id: Ie1693a8ca2f8edf07b57688e0b35751b7100d39d Reviewed-on: https://go-review.googlesource.com/c/go/+/231237 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/strconv/atof.go | 6 +++++- src/strconv/atof_test.go | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/strconv/atof.go b/src/strconv/atof.go index c1e9907e09..28ad094080 100644 --- a/src/strconv/atof.go +++ b/src/strconv/atof.go @@ -55,7 +55,11 @@ func special(s string) (f float64, n int, ok bool) { fallthrough case 'i', 'I': n := commonPrefixLenIgnoreCase(s, "infinity") - // both "inf" and "infinity" are ok + // Anything longer than "inf" is ok, but if we + // don't have "infinity", only consume "inf". + if 3 < n && n < 8 { + n = 3 + } if n == 3 || n == 8 { return math.Inf(sign), nsign + n, true } diff --git a/src/strconv/atof_test.go b/src/strconv/atof_test.go index 8201e75af6..c30cb2e0fe 100644 --- a/src/strconv/atof_test.go +++ b/src/strconv/atof_test.go @@ -486,8 +486,9 @@ func TestParseFloatPrefix(t *testing.T) { continue } // Adding characters that do not extend a number should not invalidate it. - // Test a few. - for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")"} { + // Test a few. The "i" and "init" cases test that we accept "infi", "infinit" + // correctly as "inf" with suffix. + for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")", "i", "init"} { in := test.in + suffix _, n, err := ParseFloatPrefix(in, 64) if err != nil { -- 2.48.1