From a4f057bcc3d305218e1fe4291f8c86cff55e19ca Mon Sep 17 00:00:00 2001 From: Ingo Oeser Date: Fri, 4 Sep 2015 18:22:56 +0200 Subject: [PATCH] net/mail: better errors on non-ascii characters Fixes #12492 Change-Id: I8bb512027639301e2f2c41aab84e6d06ae88b137 Reviewed-on: https://go-review.googlesource.com/14312 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/mail/message.go | 10 +++++++++- src/net/mail/message_test.go | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 266ac50a38dee..01290bc65be85 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -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, ".") { diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index 1b422743f95fb..e05af6c6ba30f 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -127,6 +127,14 @@ func TestAddressParsingError(t *testing.T) { } } +func TestAddressParsingErrorUnquotedNonASCII(t *testing.T) { + const txt = "ยต " + _, 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