Update to disallow new Go 1.13 float formats. (#5984)

Don't inadvertantly expand the acceptable ways to specify
a float.

Signed-off-by: Brian Brazil <brian.brazil@robustperception.io>
pull/5897/head
Brian Brazil 5 years ago committed by GitHub
parent b4317768b9
commit 94b1af1471
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -20,7 +20,6 @@ import (
"io" "io"
"math" "math"
"sort" "sort"
"strconv"
"strings" "strings"
"unicode/utf8" "unicode/utf8"
@ -268,7 +267,7 @@ func (p *OpenMetricsParser) Next() (Entry, error) {
if t2 != tValue { if t2 != tValue {
return EntryInvalid, parseError("expected value after metric", t) return EntryInvalid, parseError("expected value after metric", t)
} }
if p.val, err = strconv.ParseFloat(yoloString(p.l.buf()[1:]), 64); err != nil { if p.val, err = parseFloat(yoloString(p.l.buf()[1:])); err != nil {
return EntryInvalid, err return EntryInvalid, err
} }
// Ensure canonical NaN value. // Ensure canonical NaN value.
@ -283,7 +282,7 @@ func (p *OpenMetricsParser) Next() (Entry, error) {
p.hasTS = true p.hasTS = true
var ts float64 var ts float64
// A float is enough to hold what we need for millisecond resolution. // A float is enough to hold what we need for millisecond resolution.
if ts, err = strconv.ParseFloat(yoloString(p.l.buf()[1:]), 64); err != nil { if ts, err = parseFloat(yoloString(p.l.buf()[1:])); err != nil {
return EntryInvalid, err return EntryInvalid, err
} }
p.ts = int64(ts * 1000) p.ts = int64(ts * 1000)

@ -370,6 +370,22 @@ func TestOpenMetricsParseErrors(t *testing.T) {
input: "empty_label_name{=\"\"} 0", input: "empty_label_name{=\"\"} 0",
err: "expected label name or left brace, got \"EQUAL\"", err: "expected label name or left brace, got \"EQUAL\"",
}, },
{
input: "foo 1_2\n",
err: "unsupported character in float",
},
{
input: "foo 0x1p-3\n",
err: "unsupported character in float",
},
{
input: "foo 0x1P-3\n",
err: "unsupported character in float",
},
{
input: "foo 0 1_2\n",
err: "unsupported character in float",
},
} }
for i, c := range cases { for i, c := range cases {

@ -332,7 +332,7 @@ func (p *PromParser) Next() (Entry, error) {
if t2 != tValue { if t2 != tValue {
return EntryInvalid, parseError("expected value after metric", t) return EntryInvalid, parseError("expected value after metric", t)
} }
if p.val, err = strconv.ParseFloat(yoloString(p.l.buf()), 64); err != nil { if p.val, err = parseFloat(yoloString(p.l.buf())); err != nil {
return EntryInvalid, err return EntryInvalid, err
} }
// Ensure canonical NaN value. // Ensure canonical NaN value.
@ -409,3 +409,11 @@ var helpReplacer = strings.NewReplacer(
func yoloString(b []byte) string { func yoloString(b []byte) string {
return *((*string)(unsafe.Pointer(&b))) return *((*string)(unsafe.Pointer(&b)))
} }
func parseFloat(s string) (float64, error) {
// Keep to pre-Go 1.13 float formats.
if strings.ContainsAny(s, "pP_") {
return 0, fmt.Errorf("unsupported character in float")
}
return strconv.ParseFloat(s, 64)
}

@ -249,6 +249,22 @@ func TestPromParseErrors(t *testing.T) {
input: "empty_label_name{=\"\"} 0", input: "empty_label_name{=\"\"} 0",
err: "expected label name, got \"EQUAL\"", err: "expected label name, got \"EQUAL\"",
}, },
{
input: "foo 1_2\n",
err: "unsupported character in float",
},
{
input: "foo 0x1p-3\n",
err: "unsupported character in float",
},
{
input: "foo 0x1P-3\n",
err: "unsupported character in float",
},
{
input: "foo 0 1_2\n",
err: "expected next entry after timestamp, got \"MNAME\"",
},
} }
for i, c := range cases { for i, c := range cases {

Loading…
Cancel
Save