Commit 409420c0 authored by Rob Pike's avatar Rob Pike

text/template/parse: huge integers are not floats

Ideal constants in the template package are a little different from Go.
This is a case that slipped through the cracks: A huge integer number
was accepted as a floating-point number, but this loses precision
and is confusing. Also, the code in the template package (as opposed
to the parse package) wasn't expecting it.

Root this out at the source: If an integer doesn't fit an int64 or uint64,
complain right away.

Change-Id: I375621e6f5333c4d53f053a3c84a9af051711b7a
Reviewed-on: https://go-review.googlesource.com/9651Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent d5ff441d
...@@ -592,6 +592,11 @@ func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error ...@@ -592,6 +592,11 @@ func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error
} else { } else {
f, err := strconv.ParseFloat(text, 64) f, err := strconv.ParseFloat(text, 64)
if err == nil { if err == nil {
// If we parsed it as a float but it looks like an integer,
// it's a huge number too large to fit in an int. Reject it.
if !strings.ContainsAny(text, ".eE") {
return nil, fmt.Errorf("integer overflow: %q", text)
}
n.IsFloat = true n.IsFloat = true
n.Float64 = f n.Float64 = f
// If a floating-point extraction succeeded, extract the int if needed. // If a floating-point extraction succeeded, extract the int if needed.
......
...@@ -69,6 +69,7 @@ var numberTests = []numberTest{ ...@@ -69,6 +69,7 @@ var numberTests = []numberTest{
{text: "1+2."}, {text: "1+2."},
{text: "'x"}, {text: "'x"},
{text: "'xx'"}, {text: "'xx'"},
{text: "'433937734937734969526500969526500'"}, // Integer too large - issue 10634.
// Issue 8622 - 0xe parsed as floating point. Very embarrassing. // Issue 8622 - 0xe parsed as floating point. Very embarrassing.
{"0xef", true, true, true, false, 0xef, 0xef, 0xef, 0}, {"0xef", true, true, true, false, 0xef, 0xef, 0xef, 0},
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment