summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorian <ian>2000-09-17 01:52:39 +0000
committerian <ian>2000-09-17 01:52:39 +0000
commit7672a8723bc79e794488525f1711f828e98f88df (patch)
tree75b255d77c679407bcafecae6530a6069ce36537 /src
parent86114f25cf09ead75bff6bffa0c156a1437d5aeb (diff)
+ * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).
@@ -1,6 +1,7 @@ Bugfixes: + * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).
Diffstat (limited to 'src')
-rw-r--r--src/adns.h35
-rw-r--r--src/types.c2
2 files changed, 22 insertions, 15 deletions
diff --git a/src/adns.h b/src/adns.h
index df1dede..ffd8274 100644
--- a/src/adns.h
+++ b/src/adns.h
@@ -5,7 +5,7 @@
/*
*
* This file is
- * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
*
* It is part of adns, which is
* Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
@@ -151,12 +151,6 @@ typedef enum {
* names) will be quoted, as \X if it is a printing ASCII character or
* \DDD otherwise.
*
- * (The characters which will be unquoted are the printing 7-bit ASCII
- * characters except the punctuation characters " ( ) @ ; $ \
-
- * I.e. unquoted characters are alphanumerics, and the following
- * punctuation characters: ! # % ^ & * - _ = + [ ] { }
- *
* If the query goes via a CNAME then the canonical name (ie, the
* thing that the CNAME record refers to) is usually allowed to
* contain any characters, which will be quoted as above. With
@@ -179,13 +173,26 @@ typedef enum {
* header field. The particular format used is that if the mailbox
* requires quoting according to the rules in RFC822 then the
* local-part is quoted in double quotes, which end at the next
- * unescaped double quote. (\ is the escape char, and is doubled, and
- * is used to escape only \ and ".) Otherwise the local-part is
- * presented as-is. In any case this is followed by an @ and the
- * domain. The domain will not contain any characters not legal in
- * hostnames. adns will protect the application from local parts
- * containing control characters - these appear to be legal according
- * to RFC822 but are clearly a bad idea.
+ * unescaped double quote (\ is the escape char, and is doubled, and
+ * is used to escape only \ and "). If the local-part is legal
+ * without quoting according to RFC822, it is presented as-is. In any
+ * case the local-part is followed by an @ and the domain. The domain
+ * will not contain any characters not legal in hostnames.
+ *
+ * Unquoted local-parts may contain any printing 7-bit ASCII
+ * except the punctuation characters ( ) < > @ , ; : \ " [ ]
+ * I.e. they may contain alphanumerics, and the following
+ * punctuation characters: ! # % ^ & * - _ = + { } .
+ *
+ * adns will reject local parts containing control characters (byte
+ * values 0-31, 127-159, and 255) - these appear to be legal according
+ * to RFC822 but are clearly a bad idea. RFC1035 syntax does not make
+ * any distinction between a single RFC822 quoted-string containing
+ * full stops, and a series of quoted-strings separated by full stops;
+ * adns will return anything that isn't all valid atoms as a single
+ * quoted-string. RFC822 does not allow high-bit-set characters at
+ * all, but adns does allow them in local-parts, treating them as
+ * needing quoting.
*
* If you ask for the domain with _raw then _no_ checking is done
* (even on the host part, regardless of adns_qf_quoteok_anshost), and
diff --git a/src/types.c b/src/types.c
index 43ccc2b..b1fdae7 100644
--- a/src/types.c
+++ b/src/types.c
@@ -851,7 +851,7 @@ static adns_status pap_mailbox822(const parseinfo *pai, int *cbyte_io, int max,
c= *p++;
if ((c&~128) < 32 || (c&~128) == 127) return adns_s_invaliddata;
if (c == '.' && !neednorm) neednorm= 1;
- else if (c==' ' || ctype_822special(c)) needquote++;
+ else if (c==' ' || c>=127 || ctype_822special(c)) needquote++;
else neednorm= 0;
}