From 6cd86876b84b0be02b08db5fdd5046dc73dfb38d Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Sat, 4 Dec 2021 15:56:48 -0600 Subject: [PATCH] Decode: ensure signed numbers don't start with an underscore (#698) --- decode.go | 9 +++++++-- unmarshaler_test.go | 10 +++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/decode.go b/decode.go index e18b911..63a756d 100644 --- a/decode.go +++ b/decode.go @@ -386,8 +386,13 @@ func parseIntDec(b []byte) (int64, error) { } func checkAndRemoveUnderscoresIntegers(b []byte) ([]byte, error) { - if b[0] == '_' { - return nil, newDecodeError(b[0:1], "number cannot start with underscore") + start := 0 + if b[start] == '+' || b[start] == '-' { + start++ + } + + if b[start] == '_' { + return nil, newDecodeError(b[start:start+1], "number cannot start with underscore") } if b[len(b)-1] == '_' { diff --git a/unmarshaler_test.go b/unmarshaler_test.go index 076a441..bfbd6e4 100644 --- a/unmarshaler_test.go +++ b/unmarshaler_test.go @@ -2306,9 +2306,17 @@ func TestUnmarshalDecodeErrors(t *testing.T) { data: `flt8 = 224_617.445_991__228`, }, { - desc: "float with double _", + desc: "float with double .", data: `flt8 = 1..2`, }, + { + desc: "number with plus sign and leading underscore", + data: `a = +_0`, + }, + { + desc: "number with negative sign and leading underscore", + data: `a = -_0`, + }, { desc: "int with wrong base", data: `a = 0f2`,