sendmail: support long header fields for recipients
Support long header fields in To:, Cc: and Bcc: headers. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
a8ba0a0d0c
commit
236f222cde
@ -181,6 +181,12 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
char *host = sane_address(safe_gethostname());
|
char *host = sane_address(safe_gethostname());
|
||||||
unsigned nheaders = 0;
|
unsigned nheaders = 0;
|
||||||
int code;
|
int code;
|
||||||
|
enum {
|
||||||
|
HDR_OTHER = 0,
|
||||||
|
HDR_TOCC,
|
||||||
|
HDR_BCC,
|
||||||
|
} last_hdr = 0;
|
||||||
|
int check_hdr;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
//--- standard options
|
//--- standard options
|
||||||
@ -345,20 +351,31 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (opts & OPT_t) {
|
if (opts & OPT_t) {
|
||||||
if (0 == strncasecmp("To:", s, 3) || 0 == strncasecmp("Bcc:" + 1, s, 3)) {
|
if (0 == strncasecmp("To:", s, 3) || 0 == strncasecmp("Bcc:" + 1, s, 3)) {
|
||||||
rcptto_list(s+3);
|
rcptto_list(s+3);
|
||||||
|
last_hdr = HDR_TOCC;
|
||||||
goto addheader;
|
goto addheader;
|
||||||
}
|
}
|
||||||
// Bcc: header adds blind copy (hidden) recipient
|
// Bcc: header adds blind copy (hidden) recipient
|
||||||
if (0 == strncasecmp("Bcc:", s, 4)) {
|
if (0 == strncasecmp("Bcc:", s, 4)) {
|
||||||
rcptto_list(s+4);
|
rcptto_list(s+4);
|
||||||
free(s);
|
free(s);
|
||||||
|
last_hdr = HDR_BCC;
|
||||||
continue; // N.B. Bcc: vanishes from headers!
|
continue; // N.B. Bcc: vanishes from headers!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strchr(s, ':') || (list && isspace(s[0]))) {
|
check_hdr = list && isspace(s[0]);
|
||||||
|
if (strchr(s, ':') || check_hdr) {
|
||||||
// other headers go verbatim
|
// other headers go verbatim
|
||||||
// N.B. RFC2822 2.2.3 "Long Header Fields" allows for headers to occupy several lines.
|
// N.B. RFC2822 2.2.3 "Long Header Fields" allows for headers to occupy several lines.
|
||||||
// Continuation is denoted by prefixing additional lines with whitespace(s).
|
// Continuation is denoted by prefixing additional lines with whitespace(s).
|
||||||
// Thanks (stefan.seyfried at googlemail.com) for pointing this out.
|
// Thanks (stefan.seyfried at googlemail.com) for pointing this out.
|
||||||
|
if (check_hdr && last_hdr != HDR_OTHER) {
|
||||||
|
rcptto_list(s+1);
|
||||||
|
if (last_hdr == HDR_BCC)
|
||||||
|
continue;
|
||||||
|
// N.B. Bcc: vanishes from headers!
|
||||||
|
} else {
|
||||||
|
last_hdr = HDR_OTHER;
|
||||||
|
}
|
||||||
addheader:
|
addheader:
|
||||||
// N.B. we allow MAX_HEADERS generic headers at most to prevent attacks
|
// N.B. we allow MAX_HEADERS generic headers at most to prevent attacks
|
||||||
if (MAX_HEADERS && ++nheaders >= MAX_HEADERS)
|
if (MAX_HEADERS && ++nheaders >= MAX_HEADERS)
|
||||||
|
Loading…
Reference in New Issue
Block a user