mirror of
https://github.com/golang/go
synced 2024-11-27 03:21:18 -07:00
bytes: fix panic in Map
utf8.RuneLen returns -1 for an invalid rune. In that case we need to extend the internal buffer at least by 3 for \uFFFD. Fixes #7577. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/77420044
This commit is contained in:
parent
f34251a91c
commit
1a21dbc572
@ -356,7 +356,11 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
|
|||||||
}
|
}
|
||||||
r = mapping(r)
|
r = mapping(r)
|
||||||
if r >= 0 {
|
if r >= 0 {
|
||||||
if nbytes+utf8.RuneLen(r) > maxbytes {
|
rl := utf8.RuneLen(r)
|
||||||
|
if rl < 0 {
|
||||||
|
rl = len(string(utf8.RuneError))
|
||||||
|
}
|
||||||
|
if nbytes+rl > maxbytes {
|
||||||
// Grow the buffer.
|
// Grow the buffer.
|
||||||
maxbytes = maxbytes*2 + utf8.UTFMax
|
maxbytes = maxbytes*2 + utf8.UTFMax
|
||||||
nb := make([]byte, maxbytes)
|
nb := make([]byte, maxbytes)
|
||||||
|
@ -785,6 +785,16 @@ func TestMap(t *testing.T) {
|
|||||||
if string(m) != expect {
|
if string(m) != expect {
|
||||||
t.Errorf("drop: expected %q got %q", expect, m)
|
t.Errorf("drop: expected %q got %q", expect, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 6. Invalid rune
|
||||||
|
invalidRune := func(r rune) rune {
|
||||||
|
return utf8.MaxRune + 1
|
||||||
|
}
|
||||||
|
m = Map(invalidRune, []byte("x"))
|
||||||
|
expect = "\uFFFD"
|
||||||
|
if string(m) != expect {
|
||||||
|
t.Errorf("invalidRune: expected %q got %q", expect, m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) }
|
func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) }
|
||||||
|
Loading…
Reference in New Issue
Block a user