From 35d78f064b4e9f3ec28481e5e842c33a68171721 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Thu, 16 Mar 2023 19:35:48 +0000 Subject: [PATCH] Fix long headers going into DSN bodies. Bug 1760 --- src/src/deliver.c | 7 +++---- src/src/macros.h | 27 ++++++++++++++------------- src/src/transport.c | 13 +++++++++---- test/mail/0032.CALLER | 3 +-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/src/deliver.c b/src/src/deliver.c index 57a435eeb..f3a406990 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -5954,7 +5954,7 @@ wording. */ tctx.u.fd = fileno(fp); tctx.tblock = &tb; - tctx.options = topt; + tctx.options = topt | topt_truncate_headers; tb.add_headers = dsnnotifyhdr; /*XXX no checking for failure! buggy! */ @@ -6172,13 +6172,12 @@ fprintf(f, "--%s\n" fflush(f); /* header only as required by RFC. only failure DSN needs to honor RET=FULL */ tctx.u.fd = fileno(f); -tctx.options = topt_add_return_path | topt_no_body; +tctx.options = topt_add_return_path | topt_truncate_headers | topt_no_body; transport_filter_argv = NULL; /* Just in case */ return_path = sender_address; /* In case not previously set */ /* Write the original email out */ /*XXX no checking for failure! buggy! */ -/*XXX overlong headers in the original become overlong body lines here*/ transport_write_message(&tctx, 0); fflush(f); @@ -6334,7 +6333,7 @@ if (addr_senddsn) /* Write the original email out */ tctx.u.fd = fd; - tctx.options = topt_add_return_path | topt_no_body; + tctx.options = topt_add_return_path | topt_truncate_headers | topt_no_body; /*XXX hmm, FALSE(fail) retval ignored. Could error for any number of reasons, and they are not handled. */ transport_write_message(&tctx, 0); diff --git a/src/src/macros.h b/src/src/macros.h index 9f3a7b06a..73c6ac2c6 100644 --- a/src/src/macros.h +++ b/src/src/macros.h @@ -868,19 +868,20 @@ enum { /* Options for transport_write_message */ -#define topt_add_return_path 0x0001 -#define topt_add_delivery_date 0x0002 -#define topt_add_envelope_to 0x0004 -#define topt_escape_headers 0x0008 /* Apply escape check to headers */ -#define topt_use_crlf 0x0010 /* Terminate lines with CRLF */ -#define topt_no_headers 0x0020 /* Omit headers */ -#define topt_no_body 0x0040 /* Omit body */ -#define topt_end_dot 0x0080 /* Send terminating dot line */ -#define topt_no_flush 0x0100 /* more data expected after message (eg QUIT) */ -#define topt_use_bdat 0x0200 /* prepend chunks with RFC3030 BDAT header */ -#define topt_output_string 0x0400 /* create string rather than write to fd */ -#define topt_continuation 0x0800 /* do not reset buffer */ -#define topt_not_socket 0x1000 /* cannot do socket-only syscalls */ +#define topt_add_return_path BIT(0) +#define topt_add_delivery_date BIT(1) +#define topt_add_envelope_to BIT(2) +#define topt_escape_headers BIT(3) /* Apply escape check to headers */ +#define topt_truncate_headers BIT(4) /* Truncate header lines at 998 chars */ +#define topt_use_crlf BIT(5) /* Terminate lines with CRLF */ +#define topt_no_headers BIT(6) /* Omit headers */ +#define topt_no_body BIT(7) /* Omit body */ +#define topt_end_dot BIT(8) /* Send terminating dot line */ +#define topt_no_flush BIT(9) /* more data expected after message (eg QUIT) */ +#define topt_use_bdat BIT(10) /* prepend chunks with RFC3030 BDAT header */ +#define topt_output_string BIT(11) /* create string rather than write to fd */ +#define topt_continuation BIT(12) /* do not reset buffer */ +#define topt_not_socket BIT(13) /* cannot do socket-only syscalls */ /* Options for smtp_write_command */ diff --git a/src/src/transport.c b/src/src/transport.c index d6cedf911..80ba1eece 100644 --- a/src/src/transport.c +++ b/src/src/transport.c @@ -706,7 +706,7 @@ BOOL transport_headers_send(transport_ctx * tctx, BOOL (*sendfn)(transport_ctx * tctx, uschar * s, int len)) { -const uschar *list; +const uschar * list; transport_instance * tblock = tctx ? tctx->tblock : NULL; address_item * addr = tctx ? tctx->addr : NULL; @@ -761,15 +761,18 @@ for (header_line * h = header_list; h; h = h->next) if (h->type != htype_old) if (include_header) { + int len; if (tblock && tblock->rewrite_rules) { rmark reset_point = store_mark(); - header_line *hh; + header_line * hh; if ((hh = rewrite_header(h, NULL, NULL, tblock->rewrite_rules, tblock->rewrite_existflags, FALSE))) { - if (!sendfn(tctx, hh->text, hh->slen)) return FALSE; + len = hh->slen; + if (tctx->options & topt_truncate_headers && len > 998) len = 998; + if (!sendfn(tctx, hh->text, len)) return FALSE; store_reset(reset_point); continue; /* With the next header line */ } @@ -777,7 +780,9 @@ for (header_line * h = header_list; h; h = h->next) if (h->type != htype_old) /* Either no rewriting rules, or it didn't get rewritten */ - if (!sendfn(tctx, h->text, h->slen)) return FALSE; + len = h->slen; + if (tctx->options & topt_truncate_headers && len > 998) len = 998; + if (!sendfn(tctx, h->text, len)) return FALSE; } /* Header removed */ diff --git a/test/mail/0032.CALLER b/test/mail/0032.CALLER index 76aa97c73..9731b97e3 100644 --- a/test/mail/0032.CALLER +++ b/test/mail/0032.CALLER @@ -49,8 +49,7 @@ Received: from CALLER by myhost.ex with local (Exim x.yz) Message-Id: From: CALLER_NAME Date: Tue, 2 Mar 1999 09:44:33 +0000 -References: <0.ZERO.78901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.ONE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.TWO.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.THREE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.FOUR.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.FIVE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.SIX.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.SEVEN.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.EIGHT.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.NINE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.TEN.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.ELEVEN.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.TWELVE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> - +References: <0.ZERO.78901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.ONE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.TWO.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.THREE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.FOUR.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.FIVE.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.SIX.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.SEVEN.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.EIGHT.678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678@f.net> <0.NIN This is a test message. --NNNNNNNNNN-eximdsn-MMMMMMMMMM-- -- 2.30.2