Skip to content

Commit

Permalink
encoding/asn1: don't parse invalid UTF-8.
Browse files Browse the repository at this point in the history
Invalid UTF-8 triggers an error when marshaling but, previously, not
when unmarshaling. This means that ASN.1 structures were not
round-tripping.

This change makes invalid UTF-8 in a string marked as UTF-8 to be an
error when Unmarshaling.

Fixes #11126.

Change-Id: Ic37be84d21dc5c03983525e244d955a8b1e1ff14
Reviewed-on: https://go-review.googlesource.com/11056
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
  • Loading branch information
agl authored and rsc committed Jun 29, 2015
1 parent fdd921c commit 0a6df4a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/encoding/asn1/asn1.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"reflect"
"strconv"
"time"
"unicode/utf8"
)

// A StructuralError suggests that the ASN.1 data is valid, but the Go type
Expand Down Expand Up @@ -389,6 +390,9 @@ func parseT61String(bytes []byte) (ret string, err error) {
// parseUTF8String parses a ASN.1 UTF8String (raw UTF-8) from the given byte
// array and returns it.
func parseUTF8String(bytes []byte) (ret string, err error) {
if !utf8.Valid(bytes) {
return "", errors.New("asn1: invalid UTF-8 string")
}
return string(bytes), nil
}

Expand Down
18 changes: 18 additions & 0 deletions src/encoding/asn1/asn1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"fmt"
"math/big"
"reflect"
"strings"
"testing"
"time"
)
Expand Down Expand Up @@ -922,3 +923,20 @@ func TestTruncatedExplicitTag(t *testing.T) {
t.Error("Unmarshal returned without error")
}
}

type invalidUTF8Test struct {
Str string `asn1:"utf8"`
}

func TestUnmarshalInvalidUTF8(t *testing.T) {
data := []byte("0\x05\f\x03a\xc9c")
var result invalidUTF8Test
_, err := Unmarshal(data, &result)

const expectedSubstring = "UTF"
if err == nil {
t.Fatal("Successfully unmarshaled invalid UTF-8 data")
} else if !strings.Contains(err.Error(), expectedSubstring) {
t.Fatalf("Expected error to mention %q but error was %q", expectedSubstring, err.Error())
}
}

0 comments on commit 0a6df4a

Please sign in to comment.