From c360573ff84fc6dfbb370cdce0659c27ac508190 Mon Sep 17 00:00:00 2001 From: Vadim Inshakov Date: Wed, 15 Feb 2023 20:28:26 +0500 Subject: [PATCH] Set (*Stream).bufSize equal to size of (*Stream).buf when it resized --- decode_test.go | 18 ++++++++++++++++++ internal/decoder/string.go | 1 + 2 files changed, 19 insertions(+) diff --git a/decode_test.go b/decode_test.go index f139eae..618509a 100644 --- a/decode_test.go +++ b/decode_test.go @@ -267,6 +267,24 @@ func Test_Decoder_UseNumber(t *testing.T) { assertEq(t, "json.Number", "json.Number", fmt.Sprintf("%T", v["a"])) } +func Test_Decoder_UnexpectedEnd(t *testing.T) { + input := []byte("\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe200") + + dec := json.NewDecoder(bytes.NewReader(input)) + + for { + _, err := dec.Token() + if err != nil { + var e *json.SyntaxError + if errors.As(err, &e) { + assertEq(t, "error is not expected by test", e.Error(), "json: string unexpected end of JSON input") + break + } + t.Fatal(err) + } + } +} + func Test_Decoder_DisallowUnknownFields(t *testing.T) { dec := json.NewDecoder(strings.NewReader(`{"x": 1}`)) dec.DisallowUnknownFields() diff --git a/internal/decoder/string.go b/internal/decoder/string.go index 32602c9..fbb0755 100644 --- a/internal/decoder/string.go +++ b/internal/decoder/string.go @@ -270,6 +270,7 @@ func stringBytes(s *Stream) ([]byte, error) { r, size := utf8.DecodeRune(s.buf[cursor:]) if r == utf8.RuneError { s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...) + s.bufSize = int64(len(s.buf)) cursor += runeErrBytesLen s.length += runeErrBytesLen _, _, p = s.stat()