From: Alex A Skinner Date: Tue, 30 Jul 2013 04:11:47 +0000 (+1000) Subject: encoding/xml: Do not pass through invalid utf8 bytes X-Git-Tag: go1.2rc2~897 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=789e1c351e6fca96fe3cec467029732c03d55d64;p=gostls13.git encoding/xml: Do not pass through invalid utf8 bytes EscapeText now escapes 0xFFFD returned from DecodeRune as 0xFFFD, rather than passing through the original byte. Fixes #5880. R=golang-dev, r, bradfitz, adg CC=golang-dev https://golang.org/cl/11975043 --- diff --git a/src/pkg/encoding/xml/xml.go b/src/pkg/encoding/xml/xml.go index 021f7e47d9..2f36604797 100644 --- a/src/pkg/encoding/xml/xml.go +++ b/src/pkg/encoding/xml/xml.go @@ -1758,7 +1758,7 @@ func EscapeText(w io.Writer, s []byte) error { case '\r': esc = esc_cr default: - if !isInCharacterRange(r) { + if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) { esc = esc_fffd break } diff --git a/src/pkg/encoding/xml/xml_test.go b/src/pkg/encoding/xml/xml_test.go index eeedbe575f..52477d3429 100644 --- a/src/pkg/encoding/xml/xml_test.go +++ b/src/pkg/encoding/xml/xml_test.go @@ -11,6 +11,7 @@ import ( "reflect" "strings" "testing" + "unicode/utf8" ) const testInput = ` @@ -714,3 +715,14 @@ func TestEscapeTextInvalidChar(t *testing.T) { t.Errorf("have %v, want %v", text, expected) } } + +func TestIssue5880(t *testing.T) { + type T []byte + data, err := Marshal(T{192, 168, 0, 1}) + if err != nil { + t.Errorf("Marshal error: %v", err) + } + if !utf8.Valid(data) { + t.Errorf("Marshal generated invalid UTF-8: %x", data) + } +}