diff --git a/hjson_test.go b/hjson_test.go index 31d1e42..3cb530a 100644 --- a/hjson_test.go +++ b/hjson_test.go @@ -1844,3 +1844,24 @@ func TestUnmarshalStructWithExtraFields(t *testing.T) { t.Fatalf("Unexpected error: %v", err) } } + +func TestExponentNeedsDigits(t *testing.T) { + // an exponent with no digits is a quoteless string, as the encoder already treats it + for _, s := range []string{"1e", "1E", "1e+", "1.2e", "-1e"} { + var m map[string]interface{} + if err := Unmarshal([]byte("{\n k: "+s+"\n}"), &m); err != nil { + t.Fatalf("%q: %v", s, err) + } + if m["k"] != s { + t.Fatalf("%q: got %#v", s, m["k"]) + } + } + + var m map[string]interface{} + if err := Unmarshal([]byte("{\n k: 1e5\n}"), &m); err != nil { + t.Fatal(err) + } + if fmt.Sprintf("%v", m["k"]) != "100000" { + t.Fatalf("1e5: got %#v", m["k"]) + } +} diff --git a/parseNumber.go b/parseNumber.go index 7523fae..30da242 100644 --- a/parseNumber.go +++ b/parseNumber.go @@ -79,6 +79,10 @@ func tryParseNumber(text []byte, stopAtNext, useJSONNumber bool) (interface{}, e if p.ch == '-' || p.ch == '+' { p.next() } + // an exponent needs at least one digit + if p.ch < '0' || p.ch > '9' { + return 0, errors.New("Invalid number") + } for p.ch >= '0' && p.ch <= '9' { p.next() }