1
0
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:
Rui Ueyama 2014-03-18 20:52:58 -07:00 committed by Ian Lance Taylor
parent f34251a91c
commit 1a21dbc572
2 changed files with 15 additions and 1 deletions

View File

@ -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)

View File

@ -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) }