forked from mirror/go-json
Merge pull request #280 from orisano/fix-issue-278
fix: fixed buffer length bug on string decoder
This commit is contained in:
commit
dc410838e9
|
@ -247,14 +247,15 @@ func stringBytes(s *Stream) ([]byte, error) {
|
||||||
}
|
}
|
||||||
goto ERROR
|
goto ERROR
|
||||||
}
|
}
|
||||||
r, _ := utf8.DecodeRune(s.buf[cursor:])
|
r, size := utf8.DecodeRune(s.buf[cursor:])
|
||||||
b := []byte(string(r))
|
|
||||||
if r == utf8.RuneError {
|
if r == utf8.RuneError {
|
||||||
s.buf = append(append(append([]byte{}, s.buf[:cursor]...), b...), s.buf[cursor+1:]...)
|
s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...)
|
||||||
|
cursor += runeErrBytesLen
|
||||||
|
s.length += runeErrBytesLen
|
||||||
_, _, p = s.stat()
|
_, _, p = s.stat()
|
||||||
|
} else {
|
||||||
|
cursor += int64(size)
|
||||||
}
|
}
|
||||||
cursor += int64(len(b))
|
|
||||||
s.length += int64(len(b))
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
cursor++
|
cursor++
|
||||||
|
|
|
@ -515,3 +515,16 @@ func TestLongUTF8(t *testing.T) {
|
||||||
t.Errorf("string %q; want = %q", got, want)
|
t.Errorf("string %q; want = %q", got, want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue278(t *testing.T) {
|
||||||
|
a := `{"嗷嗷":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\u55f7"}`
|
||||||
|
r := strings.NewReader(a)
|
||||||
|
var m map[string]string
|
||||||
|
if err := json.NewDecoder(r).Decode(&m); err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
want := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\u55f7"
|
||||||
|
if got := m["嗷嗷"]; got != want {
|
||||||
|
t.Errorf("string %q; want = %q", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue