diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-12-03 17:49:18 -0800 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-12-03 17:49:18 -0800 |
| commit | 61f0922ceb366d06c160529b8b378661d568488b (patch) | |
| tree | c37ab6c9b1e7bb4d67b726c6f6f5f18b1116863f | |
| parent | 59fe55b149fd31fe013578e4521ded0ee449134e (diff) | |
| download | ccl-main.tar.zst | |
| -rw-r--r-- | ccl.go | 19 | ||||
| -rw-r--r-- | ccl_test.go | 23 |
2 files changed, 33 insertions, 9 deletions
@@ -310,14 +310,17 @@ func checkNum(b []byte) bool { if !haveDigits { return false } - if len(b) == 0 || !(b[0] == 'e' || b[0] == 'E') { + if len(b) == 0 { return true } + if !(b[0] == 'e' || b[0] == 'E') { + return false + } b = b[1:] if len(b) > 0 && (b[0] == '-' || b[0] == '+') { b = b[1:] } - if len(b) == 0 { + if len(b) == 0 || !('1' <= b[0] && b[0] <= '9') { return false } for ; len(b) > 0 && '0' <= b[0] && b[0] <= '9'; b = b[1:] { @@ -352,7 +355,10 @@ func (p *parser) parseInt(numBytes []byte) (integer, error) { } un, err := strconv.ParseUint(string(n), 10, 64) if err != nil { - return integer{}, p.error("(unreachable) invalid number: %s", err) + if errors.Is(err, strconv.ErrSyntax) { + panic(fmt.Sprintf("Invalid number that wasn't caught by checkNum: %s", err)) + } + return integer{}, p.error("%s", err) } return integer{un, sgn}, nil } @@ -363,7 +369,10 @@ func (p *parser) parseFloat(nBytes []byte) (float64, error) { } n, err := strconv.ParseFloat(string(nBytes), 64) if err != nil { - return 0, p.error("(unreachable) invalid number: %s", err) + if errors.Is(err, strconv.ErrSyntax) { + panic(fmt.Sprintf("Invalid number that wasn't caught by checkNum: %s", err)) + } + return 0, p.error("%s", err) } return n, nil } @@ -429,7 +438,7 @@ func (p *parser) unescape(rawStr []byte) ([]byte, error) { } n, err := strconv.ParseUint(string(rawStr[i:end]), 16, 8) if err != nil { - return nil, p.error("(unreachable) invalid hex escape %q: %s", rawStr[i-2:end], err) + panic(fmt.Sprintf("Invalid hex escape %q: %s", rawStr[i-2:end], err)) } i = end - 1 b = []byte{byte(n)} diff --git a/ccl_test.go b/ccl_test.go index ac64d58..7ec9da2 100644 --- a/ccl_test.go +++ b/ccl_test.go @@ -412,10 +412,6 @@ func TestUnmarshal_Invalid(t *testing.T) { msg: `int: .`, want: &syntaxError{line: 1, col: 6}, }, { - desc: "WeirdNum", - msg: `float:1e+`, - want: &syntaxError{line: 1, col: 7}, - }, { desc: "BadHex", msg: `int:0xgg`, want: &syntaxError{line: 1, col: 5}, @@ -540,6 +536,10 @@ func TestUnmarshal_Invalid(t *testing.T) { msg: `float:1e`, want: &syntaxError{line: 1, col: 7}, }, { + desc: "FloatPositiveMissingExponent", + msg: `float:1e+`, + want: &syntaxError{line: 1, col: 7}, + }, { desc: "UnterminatedComment", msg: `/*`, want: &syntaxError{line: 1, col: 1}, @@ -551,6 +551,18 @@ func TestUnmarshal_Invalid(t *testing.T) { int:12345; # oops typo `, want: &syntaxError{line: 4, col: 10}, + }, { + desc: "OutOfRange", + msg: `int:20000000000000000000`, + want: &syntaxError{line: 1, col: 5}, + }, { + desc: "FloatRange", + msg: `float:1e309`, + want: &syntaxError{line: 1, col: 7}, + }, { + desc: "IntLetter", + msg: `int: 1A`, + want: &syntaxError{line: 1, col: 6}, }} { t.Run(tc.desc, func(t *testing.T) { t.Parallel() @@ -926,6 +938,9 @@ from string'`, `nested_repeated: [[1]]`, `float:1e`, `/*`, + `bytes:100000000000000000000`, + `float:1e700`, + `float:1A000`, } { f.Add([]byte(tc)) } |
