]> Cypherpunks repositories - gostls13.git/commitdiff
bytes: fix panic in Map
authorRui Ueyama <ruiu@google.com>
Wed, 19 Mar 2014 03:52:58 +0000 (20:52 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 19 Mar 2014 03:52:58 +0000 (20:52 -0700)
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

src/pkg/bytes/bytes.go
src/pkg/bytes/bytes_test.go

index 644bf75b894336ea9f7dae7c60ecd73e840d15e4..0c53e4c0b71262b7dc015cb185ce1d486d8dd841 100644 (file)
@@ -356,7 +356,11 @@ func Map(mapping func(r rune) rune, s []byte) []byte {
                }
                r = mapping(r)
                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.
                                maxbytes = maxbytes*2 + utf8.UTFMax
                                nb := make([]byte, maxbytes)
index 808655a4a48622c9d4145c6278cdb46937a47a0e..b16ac9f515cca5d5ea7c616588c7821d28ffdb34 100644 (file)
@@ -785,6 +785,16 @@ func TestMap(t *testing.T) {
        if string(m) != expect {
                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) }