Skip to content

Commit 7450960

Browse files
itchynymvdan
authored andcommitted
encoding/json: fix scanner byte offset on scanEnd
scanEnd is delayed one byte so we decrement the scanner bytes count by 1 to ensure that this value is correct in the next call of Decode. Fixes golang#32399 Change-Id: I8c8698e7f95bbcf0373aceaa05319819eae9d86f GitHub-Last-Rev: 0ac25d8 GitHub-Pull-Request: golang#32598 Reviewed-on: https://go-review.googlesource.com/c/go/+/182117 Reviewed-by: Daniel Martí <mvdan@mvdan.cc> Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org>
1 parent 9c295bd commit 7450960

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/encoding/json/decode_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2345,6 +2345,41 @@ func TestUnmarshalEmbeddedUnexported(t *testing.T) {
23452345
}
23462346
}
23472347

2348+
func TestUnmarshalErrorAfterMultipleJSON(t *testing.T) {
2349+
tests := []struct {
2350+
in string
2351+
err error
2352+
}{{
2353+
in: `1 false null :`,
2354+
err: &SyntaxError{"invalid character ':' looking for beginning of value", 14},
2355+
}, {
2356+
in: `1 [] [,]`,
2357+
err: &SyntaxError{"invalid character ',' looking for beginning of value", 7},
2358+
}, {
2359+
in: `1 [] [true:]`,
2360+
err: &SyntaxError{"invalid character ':' after array element", 11},
2361+
}, {
2362+
in: `1 {} {"x"=}`,
2363+
err: &SyntaxError{"invalid character '=' after object key", 14},
2364+
}, {
2365+
in: `falsetruenul#`,
2366+
err: &SyntaxError{"invalid character '#' in literal null (expecting 'l')", 13},
2367+
}}
2368+
for i, tt := range tests {
2369+
dec := NewDecoder(strings.NewReader(tt.in))
2370+
var err error
2371+
for {
2372+
var v interface{}
2373+
if err = dec.Decode(&v); err != nil {
2374+
break
2375+
}
2376+
}
2377+
if !reflect.DeepEqual(err, tt.err) {
2378+
t.Errorf("#%d: got %#v, want %#v", i, err, tt.err)
2379+
}
2380+
}
2381+
}
2382+
23482383
type unmarshalPanic struct{}
23492384

23502385
func (unmarshalPanic) UnmarshalJSON([]byte) error { panic(0xdead) }

src/encoding/json/stream.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ Input:
102102
dec.scan.bytes++
103103
switch dec.scan.step(&dec.scan, c) {
104104
case scanEnd:
105+
// scanEnd is delayed one byte so we decrement
106+
// the scanner bytes count by 1 to ensure that
107+
// this value is correct in the next call of Decode.
108+
dec.scan.bytes--
105109
break Input
106110
case scanEndObject, scanEndArray:
107111
// scanEnd is delayed one byte.

0 commit comments

Comments
 (0)