Commit c10e6142 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

strconv: detect invalid UTF-8 in the Unquote fast path

Fixes #23685

Change-Id: I3625bd01f860077ee0976df9e3dfb66754804bcd
Reviewed-on: https://go-review.googlesource.com/92535Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 5412c0c1
...@@ -385,7 +385,9 @@ func Unquote(s string) (string, error) { ...@@ -385,7 +385,9 @@ func Unquote(s string) (string, error) {
if !contains(s, '\\') && !contains(s, quote) { if !contains(s, '\\') && !contains(s, quote) {
switch quote { switch quote {
case '"': case '"':
return s, nil if utf8.ValidString(s) {
return s, nil
}
case '\'': case '\'':
r, size := utf8.DecodeRuneInString(s) r, size := utf8.DecodeRuneInString(s)
if size == len(s) && (r != utf8.RuneError || size != 1) { if size == len(s) && (r != utf8.RuneError || size != 1) {
......
...@@ -326,6 +326,36 @@ func TestUnquote(t *testing.T) { ...@@ -326,6 +326,36 @@ func TestUnquote(t *testing.T) {
} }
} }
// Issue 23685: invalid UTF-8 should not go through the fast path.
func TestUnquoteInvalidUTF8(t *testing.T) {
tests := []struct {
in string
// one of:
want string
wantErr string
}{
{in: `"foo"`, want: "foo"},
{in: `"foo`, wantErr: "invalid syntax"},
{in: `"` + "\xc0" + `"`, want: "\xef\xbf\xbd"},
{in: `"a` + "\xc0" + `"`, want: "a\xef\xbf\xbd"},
{in: `"\t` + "\xc0" + `"`, want: "\t\xef\xbf\xbd"},
}
for i, tt := range tests {
got, err := Unquote(tt.in)
var gotErr string
if err != nil {
gotErr = err.Error()
}
if gotErr != tt.wantErr {
t.Errorf("%d. Unquote(%q) = err %v; want %q", i, tt.in, err, tt.wantErr)
}
if tt.wantErr == "" && err == nil && got != tt.want {
t.Errorf("%d. Unquote(%q) = %02x; want %02x", i, tt.in, []byte(got), []byte(tt.want))
}
}
}
func BenchmarkUnquoteEasy(b *testing.B) { func BenchmarkUnquoteEasy(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
Unquote(`"Give me a rock, paper and scissors and I will move the world."`) Unquote(`"Give me a rock, paper and scissors and I will move the world."`)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment