]> Cypherpunks repositories - gostls13.git/commitdiff
net/mail: better errors on non-ascii characters
authorIngo Oeser <nightlyone@googlemail.com>
Fri, 4 Sep 2015 16:22:56 +0000 (18:22 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 2 Dec 2015 00:25:15 +0000 (00:25 +0000)
Fixes #12492

Change-Id: I8bb512027639301e2f2c41aab84e6d06ae88b137
Reviewed-on: https://go-review.googlesource.com/14312
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/mail/message.go
src/net/mail/message_test.go

index 266ac50a38dee1b82b8effbdc65b90a4dc008a64..01290bc65be853d9979098e5231e57a8c1ba044c 100644 (file)
@@ -442,17 +442,25 @@ Loop:
        return string(qsb), nil
 }
 
+var errNonASCII = errors.New("mail: unencoded non-ASCII text in address")
+
 // consumeAtom parses an RFC 5322 atom at the start of p.
 // If dot is true, consumeAtom parses an RFC 5322 dot-atom instead.
 // If permissive is true, consumeAtom will not fail on
 // leading/trailing/double dots in the atom (see golang.org/issue/4938).
 func (p *addrParser) consumeAtom(dot bool, permissive bool) (atom string, err error) {
-       if !isAtext(p.peek(), false) {
+       if c := p.peek(); !isAtext(c, false) {
+               if c > 127 {
+                       return "", errNonASCII
+               }
                return "", errors.New("mail: invalid string")
        }
        i := 1
        for ; i < p.len() && isAtext(p.s[i], dot); i++ {
        }
+       if i < p.len() && p.s[i] > 127 {
+               return "", errNonASCII
+       }
        atom, p.s = string(p.s[:i]), p.s[i:]
        if !permissive {
                if strings.HasPrefix(atom, ".") {
index 1b422743f95fb4656265d5695529dee0ae6757c9..e05af6c6ba30f9d8ca1fb981251b4aaba33c36f3 100644 (file)
@@ -127,6 +127,14 @@ func TestAddressParsingError(t *testing.T) {
        }
 }
 
+func TestAddressParsingErrorUnquotedNonASCII(t *testing.T) {
+       const txt = "ยต <micro@example.net>"
+       _, err := ParseAddress(txt)
+       if err == nil || !strings.Contains(err.Error(), "unencoded non-ASCII text in address") {
+               t.Errorf(`mail.ParseAddress(%q) err: %q, want ".*unencoded non-ASCII text in address.*"`, txt, err)
+       }
+}
+
 func TestAddressParsing(t *testing.T) {
        tests := []struct {
                addrsStr string