For the benefit of those using Exim with Cyrus ([PATCH] New feature:
remove ASCII NUL from message data)
Phil Brutsche
phil at optimumdata.com
Wed Apr 9 14:46:27 EDT 2003
This is a message I sent to another list earlier today with a patch for
Exim to strip NUL characters from messages as they are received.
It will probably be of interest to some people.
Phil Brutsche wrote:
> Background:
>
> Some email clients are quite persistent in putting binary "junk" in
> message bodies; this junk manifests itself as the ASCII NUL character.
> It is seen (for me anyway) immediately following base64 data; the email
> client is almost always Microsoft Outlook in either Corporate mode or
> Internet mode, although some other email clients have been seen to cause
> this problem.
>
> Cyrus, which we use for POP3 and IMAP (Exim is the MTA), isn't very
> tolerant of this binary data and refuses to deliver the message, causing
> it to bounce.
>
> The people I derive my income from tell me bouncing the messages isn't
> an option.
>
> The fix:
>
> I have created a patch, against 4.14 (no idea if it'll work with older
> versions), that adds a main configuration option called
> "strip_nul_char". This option defaults to off, and provides the same
> behavior as an unpatched Exim.
>
> Setting "strip_nul_char" to true causes Exim to remove NULs from SMTP
> and non-SMTP message bodies as they are received.
>
> At a later date I intend to make this an option for the lmtp and smtp
> transports.
>
> The patch has received some testing here and seems to work fine (with
> and without exiscan), but more testing is welcome.
>
> Comments and constructive criticism welcome, flames to /dev/null.
--
Phil Brutsche
phil at optimumdata.com
-------------- next part --------------
diff -u -r exim-4.14/src/globals.c exim-4.14-modified/src/globals.c
--- exim-4.14/src/globals.c Tue Mar 11 06:20:20 2003
+++ exim-4.14-modified/src/globals.c Tue Apr 8 17:22:27 2003
@@ -846,6 +846,7 @@
"\0<--------------Space to patch spool_directory->";
int string_datestamp_offset= -1;
BOOL strip_excess_angle_brackets = FALSE;
+BOOL strip_nul_char = FALSE;
BOOL strip_trailing_dot = FALSE;
BOOL synchronous_delivery = FALSE;
BOOL syslog_timestamp = TRUE;
diff -u -r exim-4.14/src/globals.h exim-4.14-modified/src/globals.h
--- exim-4.14/src/globals.h Tue Mar 11 06:20:20 2003
+++ exim-4.14-modified/src/globals.h Tue Apr 8 12:40:16 2003
@@ -511,6 +511,7 @@
extern uschar *spool_directory; /* Name of spool directory */
extern int string_datestamp_offset;/* After insertion by string_format */
extern BOOL strip_excess_angle_brackets; /* Surrounding route-addrs */
+extern BOOL strip_nul_char; /* Remove ASCII NUL from messages */
extern BOOL strip_trailing_dot; /* Remove dots at ends of domains */
extern BOOL synchronous_delivery; /* TRUE if -odi is set */
extern BOOL syslog_timestamp; /* TRUE if time on syslogs */
diff -u -r exim-4.14/src/readconf.c exim-4.14-modified/src/readconf.c
--- exim-4.14/src/readconf.c Tue Mar 11 06:20:22 2003
+++ exim-4.14-modified/src/readconf.c Mon Apr 7 16:35:39 2003
@@ -270,6 +270,7 @@
{ "split_spool_directory", opt_bool, &split_spool_directory },
{ "spool_directory", opt_stringptr, &spool_directory },
{ "strip_excess_angle_brackets", opt_bool, &strip_excess_angle_brackets },
+ { "strip_nul_char", opt_bool, &strip_nul_char },
{ "strip_trailing_dot", opt_bool, &strip_trailing_dot },
{ "syslog_timestamp", opt_bool, &syslog_timestamp },
{ "system_filter", opt_stringptr, &system_filter },
diff -u -r exim-4.14/src/receive.c exim-4.14-modified/src/receive.c
--- exim-4.14/src/receive.c Tue Mar 11 06:20:22 2003
+++ exim-4.14-modified/src/receive.c Tue Apr 8 15:05:13 2003
@@ -441,6 +441,8 @@
for (; (ch = (receive_getc)()) != EOF; last_ch = ch)
{
+ if (strip_nul_char && (ch == 0))
+ continue;
if (drop_cr)
{
if (last_ch == '\r' && ch != '\n')
@@ -476,6 +478,8 @@
while ((ch = (receive_getc)()) != EOF)
{
+ if (strip_nul_char && (ch == 0))
+ continue;
switch (ch_state)
{
case 0: /* Normal state */
@@ -572,6 +576,8 @@
while ((ch = (receive_getc)()) != EOF)
{
+ if (strip_nul_char && (ch == 0))
+ continue;
switch (ch_state)
{
case 0: /* After LF or CRLF */
More information about the Info-cyrus
mailing list