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, ".") {
}
}
+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