From 3694ae88f6fd8d08fd150fe39823666ada503873 Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Thu, 28 Oct 2021 20:41:10 -0400 Subject: [PATCH] decode: error on _ before exponent in floats (#647) Fixes #646 --- decode.go | 3 +++ unmarshaler_test.go | 22 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/decode.go b/decode.go index cd21bee..25e69c4 100644 --- a/decode.go +++ b/decode.go @@ -405,6 +405,9 @@ func checkAndRemoveUnderscoresFloats(b []byte) ([]byte, error) { if !before { return nil, newDecodeError(b[i-1:i+1], "number must have at least one digit between underscores") } + if i < len(b)-1 && (b[i+1] == 'e' || b[i+1] == 'E') { + return nil, newDecodeError(b[i+1:i+2], "cannot have underscore before exponent") + } before = false case 'e', 'E': if i < len(b)-1 && b[i+1] == '_' { diff --git a/unmarshaler_test.go b/unmarshaler_test.go index 6ccd2d0..6259b3a 100644 --- a/unmarshaler_test.go +++ b/unmarshaler_test.go @@ -204,6 +204,16 @@ func TestUnmarshal_Floats(t *testing.T) { assert.True(t, math.IsNaN(v)) }, }, + { + desc: "underscore after integer part", + input: `1_e2`, + err: true, + }, + { + desc: "underscore after integer part", + input: `1.0_e2`, + err: true, + }, } type doc struct { @@ -215,11 +225,15 @@ func TestUnmarshal_Floats(t *testing.T) { t.Run(e.desc, func(t *testing.T) { doc := doc{} err := toml.Unmarshal([]byte(`A = `+e.input), &doc) - require.NoError(t, err) - if e.testFn != nil { - e.testFn(t, doc.A) + if e.err { + require.Error(t, err) } else { - assert.Equal(t, e.expected, doc.A) + require.NoError(t, err) + if e.testFn != nil { + e.testFn(t, doc.A) + } else { + assert.Equal(t, e.expected, doc.A) + } } }) }