diff options
author | V3n3RiX <venerix@koprulu.sector> | 2024-01-12 13:08:05 +0000 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2024-01-12 13:08:05 +0000 |
commit | 4c4e8e9bf6d1ef49be600d77fcbbd7be716aece7 (patch) | |
tree | c854c61724b1a5430091a4512ef763d26efe5938 /mail-mta/exim/files | |
parent | 669bfefc6b9cafab1e89f098b21cf0f89c12d995 (diff) |
gentoo auto-resync : 12:01:2024 - 13:08:05
Diffstat (limited to 'mail-mta/exim/files')
-rw-r--r-- | mail-mta/exim/files/exim-4.93-as-needed-ldflags.patch | 145 | ||||
-rw-r--r-- | mail-mta/exim/files/exim-4.94-opendmarc-1.4.patch | 14 | ||||
-rw-r--r-- | mail-mta/exim/files/exim-4.95-localscan_dlopen.patch | 221 | ||||
-rw-r--r-- | mail-mta/exim/files/exim-4.97-CVE-2023-51766.patch | 265 |
4 files changed, 0 insertions, 645 deletions
diff --git a/mail-mta/exim/files/exim-4.93-as-needed-ldflags.patch b/mail-mta/exim/files/exim-4.93-as-needed-ldflags.patch deleted file mode 100644 index 3b3ea4628174..000000000000 --- a/mail-mta/exim/files/exim-4.93-as-needed-ldflags.patch +++ /dev/null @@ -1,145 +0,0 @@ -https://bugs.gentoo.org/show_bug.cgi?id=352265 - -Make sure LDFLAGS comes first, such that all libraries are considered, -and not discarded when --as-needed is in effect. - -https://bugs.gentoo.org/show_bug.cgi?id=391279 - -Use LDFLAGS for all targets, not just the exim binary, such that ---as-needed works as well. - - ---- a/OS/Makefile-Base -+++ b/OS/Makefile-Base -@@ -496,12 +496,12 @@ - buildrouters buildtransports \ - $(OBJ_EXIM) version.o - @echo "$(LNCC) -o exim" -- $(FE)$(PURIFY) $(LNCC) -o exim $(LFLAGS) $(OBJ_EXIM) version.o \ -+ $(FE)$(PURIFY) $(LNCC) -o exim $(LDFLAGS) $(OBJ_EXIM) version.o \ - routers/routers.a transports/transports.a lookups/lookups.a \ - auths/auths.a pdkim/pdkim.a \ - $(LIBRESOLV) $(LIBS) $(LIBS_EXIM) $(IPV6_LIBS) $(EXTRALIBS) \ - $(EXTRALIBS_EXIM) $(DBMLIB) $(LOOKUP_LIBS) $(AUTH_LIBS) \ -- $(PERL_LIBS) $(TLS_LIBS) $(PCRE_LIBS) $(LDFLAGS) -+ $(PERL_LIBS) $(TLS_LIBS) $(PCRE_LIBS) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim; \ - $(STRIP_COMMAND) exim; \ -@@ -517,8 +517,8 @@ - - exim_dumpdb: $(OBJ_DUMPDB) - @echo "$(LNCC) -o exim_dumpdb" -- $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_dumpdb $(LFLAGS) $(OBJ_DUMPDB) \ -- $(LIBS) $(EXTRALIBS) $(DBMLIB) -+ $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_dumpdb $(LDFLAGS) $(OBJ_DUMPDB) \ -+ $(LIBS) $(EXTRALIBS) $(DBMLIB) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim_dumpdb; \ - $(STRIP_COMMAND) exim_dumpdb; \ -@@ -532,8 +532,8 @@ - - exim_fixdb: $(OBJ_FIXDB) - @echo "$(LNCC) -o exim_fixdb" -- $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_fixdb $(LFLAGS) $(OBJ_FIXDB) \ -- $(LIBS) $(EXTRALIBS) $(DBMLIB) -+ $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_fixdb $(LDFLAGS) $(OBJ_FIXDB) \ -+ $(LIBS) $(EXTRALIBS) $(DBMLIB) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim_fixdb; \ - $(STRIP_COMMAND) exim_fixdb; \ -@@ -547,8 +547,8 @@ - - exim_tidydb: $(OBJ_TIDYDB) - @echo "$(LNCC) -o exim_tidydb" -- $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_tidydb $(LFLAGS) $(OBJ_TIDYDB) \ -- $(LIBS) $(EXTRALIBS) $(DBMLIB) -+ $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_tidydb $(LDFLAGS) $(OBJ_TIDYDB) \ -+ $(LIBS) $(EXTRALIBS) $(DBMLIB) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim_tidydb; \ - $(STRIP_COMMAND) exim_tidydb; \ -@@ -560,8 +560,8 @@ - - exim_dbmbuild: exim_dbmbuild.o - @echo "$(LNCC) -o exim_dbmbuild" -- $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_dbmbuild $(LFLAGS) exim_dbmbuild.o \ -- $(LIBS) $(EXTRALIBS) $(DBMLIB) -+ $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_dbmbuild $(LDFLAGS) exim_dbmbuild.o \ -+ $(LIBS) $(EXTRALIBS) $(DBMLIB) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim_dbmbuild; \ - $(STRIP_COMMAND) exim_dbmbuild; \ -@@ -575,8 +575,8 @@ - @echo "$(CC) exim_lock.c" - $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) exim_lock.c - @echo "$(LNCC) -o exim_lock" -- $(FE)$(LNCC) -o exim_lock $(LFLAGS) exim_lock.o \ -- $(LIBS) $(EXTRALIBS) -+ $(FE)$(LNCC) -o exim_lock $(LDFLAGS) exim_lock.o \ -+ $(LIBS) $(EXTRALIBS) $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) exim_lock; \ - $(STRIP_COMMAND) exim_lock; \ -@@ -612,9 +612,9 @@ - $(FE)$(CC) -o em_version.o -c \ - $(CFLAGS) $(XINCLUDE) -I. ../exim_monitor/em_version.c - @echo "$(LNCC) -o eximon.bin" -- $(FE)$(PURIFY) $(LNCC) -o eximon.bin em_version.o $(LFLAGS) $(XLFLAGS) \ -+ $(FE)$(PURIFY) $(LNCC) -o eximon.bin em_version.o $(LDFLAGS) $(XLFLAGS) \ - $(OBJ_MONBIN) -lXaw -lXmu -lXt -lXext -lX11 $(PCRE_LIBS) \ -- $(LIBS) $(LIBS_EXIMON) $(EXTRALIBS) $(EXTRALIBS_EXIMON) -lc -+ $(LIBS) $(LIBS_EXIMON) $(EXTRALIBS) $(EXTRALIBS_EXIMON) -lc $(LFLAGS) - @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ - echo $(STRIP_COMMAND) eximon.bin; \ - $(STRIP_COMMAND) eximon.bin; \ -@@ -947,9 +947,9 @@ - string.o tod.o version.o utf8.o - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE dbfn.c - $(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY store.c -- $(LNCC) -o test_dbfn $(LFLAGS) dbfn.o \ -+ $(LNCC) -o test_dbfn $(LDFLAGS) dbfn.o \ - dummies.o sa-globals.o sa-os.o store.o string.o \ -- tod.o version.o utf8.o $(LIBS) $(DBMLIB) $(LDFLAGS) -+ tod.o version.o utf8.o $(LIBS) $(DBMLIB) $(LFLAGS) - rm -f dbfn.o store.o - - test_host: config.h child.c host.c dns.c dummies.c sa-globals.o os.o \ -@@ -958,29 +958,29 @@ - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST host.c - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dns.c - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dummies.c -- $(LNCC) -o test_host $(LFLAGS) \ -+ $(LNCC) -o test_host $(LDFLAGS) \ - host.o child.o dns.o dummies.o sa-globals.o os.o store.o string.o \ -- tod.o tree.o $(LIBS) $(LIBRESOLV) -+ tod.o tree.o $(LIBS) $(LIBRESOLV) $(LFLAGS) - rm -f child.o dummies.o host.o dns.o - - test_os: os.h os.c dummies.o sa-globals.o store.o string.o tod.o utf8.o - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE os.c -- $(LNCC) -o test_os $(LFLAGS) os.o dummies.o \ -- sa-globals.o store.o string.o tod.o utf8.o $(LIBS) $(LDFLAGS) -+ $(LNCC) -o test_os $(LDFLAGS) os.o dummies.o \ -+ sa-globals.o store.o string.o tod.o utf8.o $(LIBS) $(LFLAGS) - rm -f os.o - - test_parse: config.h parse.c dummies.o sa-globals.o \ - store.o string.o tod.o version.o utf8.o - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE parse.c -- $(LNCC) -o test_parse $(LFLAGS) parse.o \ -+ $(LNCC) -o test_parse $(LDFLAGS) parse.o \ - dummies.o sa-globals.o store.o string.o tod.o version.o \ -- utf8.o $(LDFLAGS) -+ utf8.o $(LFLAGS) - rm -f parse.o - - test_string: config.h string.c dummies.o sa-globals.o store.o tod.o utf8.o - $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE string.c -- $(LNCC) -o test_string $(LFLAGS) -DSTAND_ALONE string.o \ -- dummies.o sa-globals.o store.o tod.o utf8.o $(LIBS) $(LDFLAGS) -+ $(LNCC) -o test_string $(LDFLAGS) -DSTAND_ALONE string.o \ -+ dummies.o sa-globals.o store.o tod.o utf8.o $(LIBS) $(LFLAGS) - rm -f string.o - - # End diff --git a/mail-mta/exim/files/exim-4.94-opendmarc-1.4.patch b/mail-mta/exim/files/exim-4.94-opendmarc-1.4.patch deleted file mode 100644 index d37c320d1592..000000000000 --- a/mail-mta/exim/files/exim-4.94-opendmarc-1.4.patch +++ /dev/null @@ -1,14 +0,0 @@ -https://bugs.exim.org/show_bug.cgi?id=2728 - - ---- a/src/dmarc.c -+++ b/src/dmarc.c -@@ -446,7 +446,7 @@ - vs == PDKIM_VERIFY_INVALID ? DMARC_POLICY_DKIM_OUTCOME_TMPFAIL : - DMARC_POLICY_DKIM_OUTCOME_NONE; - libdm_status = opendmarc_policy_store_dkim(dmarc_pctx, US sig->domain, -- dkim_result, US""); -+ sig->selector, dkim_result, US""); - DEBUG(D_receive) - debug_printf("DMARC adding DKIM sender domain = %s\n", sig->domain); - if (libdm_status != DMARC_PARSE_OKAY) diff --git a/mail-mta/exim/files/exim-4.95-localscan_dlopen.patch b/mail-mta/exim/files/exim-4.95-localscan_dlopen.patch deleted file mode 100644 index 320cc9936da9..000000000000 --- a/mail-mta/exim/files/exim-4.95-localscan_dlopen.patch +++ /dev/null @@ -1,221 +0,0 @@ -Only in exim-4.95: dlopen.patch -diff -aur exim-4.95.orig/src/config.h.defaults exim-4.95/src/config.h.defaults ---- exim-4.95.orig/src/config.h.defaults 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/config.h.defaults 2021-09-29 08:20:03.677883649 +0200 -@@ -35,6 +35,8 @@ - - #define AUTH_VARS 4 - -+#define DLOPEN_LOCAL_SCAN -+ - #define BIN_DIRECTORY - - #define CONFIGURE_FILE -Only in exim-4.95/src: config.h.defaults.orig -diff -aur exim-4.95.orig/src/EDITME exim-4.95/src/EDITME ---- exim-4.95.orig/src/EDITME 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/EDITME 2021-09-29 08:20:03.678883649 +0200 -@@ -883,6 +883,24 @@ - - - #------------------------------------------------------------------------------ -+# On systems which support dynamic loading of shared libraries, Exim can -+# load a local_scan function specified in its config file instead of having -+# to be recompiled with the desired local_scan function. For a full -+# description of the API to this function, see the Exim specification. -+ -+#DLOPEN_LOCAL_SCAN=yes -+ -+# If you set DLOPEN_LOCAL_SCAN, then you need to include -rdynamic in the -+# linker flags. Without it, the loaded .so won't be able to access any -+# functions from exim. -+ -+LFLAGS = -rdynamic -+ifeq ($(OSTYPE),Linux) -+LFLAGS += -ldl -+endif -+ -+ -+#------------------------------------------------------------------------------ - # The default distribution of Exim contains only the plain text form of the - # documentation. Other forms are available separately. If you want to install - # the documentation in "info" format, first fetch the Texinfo documentation -Only in exim-4.95/src: EDITME.orig -diff -aur exim-4.95.orig/src/globals.c exim-4.95/src/globals.c ---- exim-4.95.orig/src/globals.c 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/globals.c 2021-09-29 08:20:03.679883649 +0200 -@@ -42,6 +42,10 @@ - - uschar *no_aliases = NULL; - -+#ifdef DLOPEN_LOCAL_SCAN -+uschar *local_scan_path = NULL; -+#endif -+ - - /* For comments on these variables, see globals.h. I'm too idle to - duplicate them here... */ -Only in exim-4.95/src: globals.c.orig -diff -aur exim-4.95.orig/src/globals.h exim-4.95/src/globals.h ---- exim-4.95.orig/src/globals.h 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/globals.h 2021-09-29 08:20:03.680883648 +0200 -@@ -170,6 +170,9 @@ - extern int (*receive_ferror)(void); - extern BOOL (*receive_smtp_buffered)(void); - -+#ifdef DLOPEN_LOCAL_SCAN -+extern uschar *local_scan_path; /* Path to local_scan() library */ -+#endif - - /* For clearing, saving, restoring address expansion variables. We have to have - the size of this vector set explicitly, because it is referenced from more than -Only in exim-4.95/src: globals.h.orig -diff -aur exim-4.95.orig/src/local_scan.c exim-4.95/src/local_scan.c ---- exim-4.95.orig/src/local_scan.c 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/local_scan.c 2021-09-29 08:23:33.756785663 +0200 -@@ -54,10 +54,130 @@ - is used in the rejection message. - */ - -+#ifdef DLOPEN_LOCAL_SCAN -+# include <stdlib.h> -+# include <dlfcn.h> -+static int (*local_scan_fn)(int fd, uschar **return_text) = NULL; -+static int load_local_scan_library(void); -+extern uschar *local_scan_path; /* Path to local_scan() library */ -+#endif -+ - int - local_scan(int fd, uschar **return_text) - { --return LOCAL_SCAN_ACCEPT; -+#ifdef DLOPEN_LOCAL_SCAN -+/* local_scan_path is defined AND not the empty string */ -+if (local_scan_path && *local_scan_path) -+ { -+ if (!local_scan_fn) -+ { -+ if (!load_local_scan_library()) -+ { -+ char *base_msg , *error_msg , *final_msg ; -+ int final_length = -1 ; -+ -+ base_msg=US"Local configuration error - local_scan() library failure\n"; -+ error_msg = dlerror() ; -+ -+ final_length = strlen(base_msg) + strlen(error_msg) + 1 ; -+ final_msg = (char*)malloc( final_length*sizeof(char) ) ; -+ *final_msg = '\0' ; -+ -+ strcat( final_msg , base_msg ) ; -+ strcat( final_msg , error_msg ) ; -+ -+ *return_text = final_msg ; -+ return LOCAL_SCAN_TEMPREJECT; -+ } -+ } -+ return local_scan_fn(fd, return_text); -+ } -+else -+#endif -+ return LOCAL_SCAN_ACCEPT; -+} -+ -+#ifdef DLOPEN_LOCAL_SCAN -+ -+static int load_local_scan_library(void) -+{ -+/* No point in keeping local_scan_lib since we'll never dlclose() anyway */ -+void *local_scan_lib = NULL; -+int (*local_scan_version_fn)(void); -+int vers_maj; -+int vers_min; -+ -+local_scan_lib = dlopen(local_scan_path, RTLD_NOW); -+if (!local_scan_lib) -+ { -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() library open failed - " -+ "message temporarily rejected"); -+ return FALSE; -+ } -+ -+local_scan_version_fn = dlsym(local_scan_lib, "local_scan_version_major"); -+if (!local_scan_version_fn) -+ { -+ dlclose(local_scan_lib); -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() library doesn't contain " -+ "local_scan_version_major() function - message temporarily rejected"); -+ return FALSE; -+ } -+ -+/* The major number is increased when the ABI is changed in a non -+ backward compatible way. */ -+vers_maj = local_scan_version_fn(); -+ -+local_scan_version_fn = dlsym(local_scan_lib, "local_scan_version_minor"); -+if (!local_scan_version_fn) -+ { -+ dlclose(local_scan_lib); -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() library doesn't contain " -+ "local_scan_version_minor() function - message temporarily rejected"); -+ return FALSE; -+ } -+ -+/* The minor number is increased each time a new feature is added (in a -+ way that doesn't break backward compatibility) -- Marc */ -+vers_min = local_scan_version_fn(); -+ -+ -+if (vers_maj != LOCAL_SCAN_ABI_VERSION_MAJOR) -+ { -+ dlclose(local_scan_lib); -+ local_scan_lib = NULL; -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() has an incompatible major" -+ "version number, you need to recompile your module for this version" -+ "of exim (The module was compiled for version %d.%d and this exim provides" -+ "ABI version %d.%d)", vers_maj, vers_min, LOCAL_SCAN_ABI_VERSION_MAJOR, -+ LOCAL_SCAN_ABI_VERSION_MINOR); -+ return FALSE; -+ } -+else if (vers_min > LOCAL_SCAN_ABI_VERSION_MINOR) -+ { -+ dlclose(local_scan_lib); -+ local_scan_lib = NULL; -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() has an incompatible minor" -+ "version number, you need to recompile your module for this version" -+ "of exim (The module was compiled for version %d.%d and this exim provides" -+ "ABI version %d.%d)", vers_maj, vers_min, LOCAL_SCAN_ABI_VERSION_MAJOR, -+ LOCAL_SCAN_ABI_VERSION_MINOR); -+ return FALSE; -+ } -+ -+local_scan_fn = dlsym(local_scan_lib, "local_scan"); -+if (!local_scan_fn) -+ { -+ dlclose(local_scan_lib); -+ log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() library doesn't contain " -+ "local_scan() function - message temporarily rejected"); -+ return FALSE; -+ } -+ -+return TRUE; - } - -+#endif /* DLOPEN_LOCAL_SCAN */ -+ -+ - /* End of local_scan.c */ -diff -aur exim-4.95.orig/src/readconf.c exim-4.95/src/readconf.c ---- exim-4.95.orig/src/readconf.c 2021-09-28 10:24:46.000000000 +0200 -+++ exim-4.95/src/readconf.c 2021-09-29 08:20:03.682883647 +0200 -@@ -215,6 +215,9 @@ - { "local_from_prefix", opt_stringptr, {&local_from_prefix} }, - { "local_from_suffix", opt_stringptr, {&local_from_suffix} }, - { "local_interfaces", opt_stringptr, {&local_interfaces} }, -+#ifdef DLOPEN_LOCAL_SCAN -+ { "local_scan_path", opt_stringptr, {&local_scan_path} }, -+#endif - #ifdef HAVE_LOCAL_SCAN - { "local_scan_timeout", opt_time, {&local_scan_timeout} }, - #endif -Only in exim-4.95/src: readconf.c.orig diff --git a/mail-mta/exim/files/exim-4.97-CVE-2023-51766.patch b/mail-mta/exim/files/exim-4.97-CVE-2023-51766.patch deleted file mode 100644 index 7eed4eb1855f..000000000000 --- a/mail-mta/exim/files/exim-4.97-CVE-2023-51766.patch +++ /dev/null @@ -1,265 +0,0 @@ -https://nvd.nist.gov/vuln/detail/CVE-2023-51766 - - -From cf1376206284f2a4f11e32d931d4aade34c206c5 Mon Sep 17 00:00:00 2001 -From: Jeremy Harris <jgh146exb@wizmail.org> -Date: Fri, 22 Dec 2023 23:57:05 +0000 -Subject: [PATCH] Reject "dot, LF" as ending data phase. Bug 3063 - -From 5bb786d5ad568a88d50d15452aacc8404047e5ca Mon Sep 17 00:00:00 2001 -From: Jeremy Harris <jgh146exb@wizmail.org> -Date: Sat, 23 Dec 2023 17:42:57 +0000 -Subject: [PATCH] Reject "dot, LF" as ending data phase (pt. 2). Bug 3063 - -reduced to source changes only for Gentoo - - - -diff --git a/src/src/receive.c b/src/src/receive.c -index e35400aec..c6f612832 100644 ---- a/src/src/receive.c -+++ b/src/src/receive.c -@@ -836,93 +842,101 @@ - */ - - static int --read_message_data_smtp(FILE *fout) -+read_message_data_smtp(FILE * fout, BOOL strict_crlf) - { --int ch_state = 0; --int ch; --int linelength = 0; -+enum { s_linestart, s_normal, s_had_cr, s_had_nl_dot, s_had_dot_cr } ch_state = -+ s_linestart; -+int linelength = 0, ch; - - while ((ch = (receive_getc)(GETC_BUFFER_UNLIMITED)) != EOF) - { - if (ch == 0) body_zerocount++; - switch (ch_state) - { -- case 0: /* After LF or CRLF */ -- if (ch == '.') -- { -- ch_state = 3; -- continue; /* Don't ever write . after LF */ -- } -- ch_state = 1; -+ case s_linestart: /* After LF or CRLF */ -+ if (ch == '.') -+ { -+ ch_state = s_had_nl_dot; -+ continue; /* Don't ever write . after LF */ -+ } -+ ch_state = s_normal; - -- /* Else fall through to handle as normal uschar. */ -+ /* Else fall through to handle as normal uschar. */ - -- case 1: /* Normal state */ -- if (ch == '\n') -- { -- ch_state = 0; -- body_linecount++; -+ case s_normal: /* Normal state */ -+ if (ch == '\r') -+ { -+ ch_state = s_had_cr; -+ continue; /* Don't write the CR */ -+ } -+ if (ch == '\n') /* Bare LF at end of line */ -+ if (strict_crlf) -+ ch = ' '; /* replace LF with space */ -+ else -+ { /* treat as line ending */ -+ ch_state = s_linestart; -+ body_linecount++; -+ if (linelength > max_received_linelength) -+ max_received_linelength = linelength; -+ linelength = -1; -+ } -+ break; -+ -+ case s_had_cr: /* After (unwritten) CR */ -+ body_linecount++; /* Any char ends line */ - if (linelength > max_received_linelength) -- max_received_linelength = linelength; -+ max_received_linelength = linelength; - linelength = -1; -- } -- else if (ch == '\r') -- { -- ch_state = 2; -- continue; -- } -- break; -+ if (ch == '\n') /* proper CRLF */ -+ ch_state = s_linestart; -+ else -+ { -+ message_size++; /* convert the dropped CR to a stored NL */ -+ if (fout && fputc('\n', fout) == EOF) return END_WERROR; -+ cutthrough_data_put_nl(); -+ if (ch == '\r') /* CR; do not write */ -+ continue; -+ ch_state = s_normal; /* not LF or CR; process as standard */ -+ } -+ break; - -- case 2: /* After (unwritten) CR */ -- body_linecount++; -- if (linelength > max_received_linelength) -- max_received_linelength = linelength; -- linelength = -1; -- if (ch == '\n') -- { -- ch_state = 0; -- } -- else -- { -- message_size++; -- if (fout != NULL && fputc('\n', fout) == EOF) return END_WERROR; -- cutthrough_data_put_nl(); -- if (ch != '\r') ch_state = 1; else continue; -- } -- break; -+ case s_had_nl_dot: /* After [CR] LF . */ -+ if (ch == '\n') /* [CR] LF . LF */ -+ if (strict_crlf) -+ ch = ' '; /* replace LF with space */ -+ else -+ return END_DOT; -+ else if (ch == '\r') /* [CR] LF . CR */ -+ { -+ ch_state = s_had_dot_cr; -+ continue; /* Don't write the CR */ -+ } -+ /* The dot was removed on reaching s_had_nl_dot. For a doubled dot, here, -+ reinstate it to cutthrough. The current ch, dot or not, is passed both to -+ cutthrough and to file below. */ -+ else if (ch == '.') -+ { -+ uschar c = ch; -+ cutthrough_data_puts(&c, 1); -+ } -+ ch_state = s_normal; -+ break; - -- case 3: /* After [CR] LF . */ -- if (ch == '\n') -- return END_DOT; -- if (ch == '\r') -- { -- ch_state = 4; -- continue; -- } -- /* The dot was removed at state 3. For a doubled dot, here, reinstate -- it to cutthrough. The current ch, dot or not, is passed both to cutthrough -- and to file below. */ -- if (ch == '.') -- { -- uschar c= ch; -- cutthrough_data_puts(&c, 1); -- } -- ch_state = 1; -- break; -+ case s_had_dot_cr: /* After [CR] LF . CR */ -+ if (ch == '\n') -+ return END_DOT; /* Preferred termination */ - -- case 4: /* After [CR] LF . CR */ -- if (ch == '\n') return END_DOT; -- message_size++; -- body_linecount++; -- if (fout != NULL && fputc('\n', fout) == EOF) return END_WERROR; -- cutthrough_data_put_nl(); -- if (ch == '\r') -- { -- ch_state = 2; -- continue; -- } -- ch_state = 1; -- break; -+ message_size++; /* convert the dropped CR to a stored NL */ -+ body_linecount++; -+ if (fout && fputc('\n', fout) == EOF) return END_WERROR; -+ cutthrough_data_put_nl(); -+ if (ch == '\r') -+ { -+ ch_state = s_had_cr; -+ continue; /* CR; do not write */ -+ } -+ ch_state = s_normal; -+ break; - } - - /* Add the character to the spool file, unless skipping; then loop for the -@@ -1140,7 +1152,7 @@ receive_swallow_smtp(void) - { - if (message_ended >= END_NOTENDED) - message_ended = chunking_state <= CHUNKING_OFFERED -- ? read_message_data_smtp(NULL) -+ ? read_message_data_smtp(NULL, FALSE) - : read_message_bdat_smtp_wire(NULL); - } - -@@ -1960,8 +1960,10 @@ for (;;) - - if (ch == '\n') - { -- if (first_line_ended_crlf == TRUE_UNSET) first_line_ended_crlf = FALSE; -- else if (first_line_ended_crlf) receive_ungetc(' '); -+ if (first_line_ended_crlf == TRUE_UNSET) -+ first_line_ended_crlf = FALSE; -+ else if (first_line_ended_crlf) -+ receive_ungetc(' '); - goto EOL; - } - -@@ -1977,7 +1980,11 @@ for (;;) - if (f.dot_ends && ptr == 0 && ch == '.') - { - ch = (receive_getc)(GETC_BUFFER_UNLIMITED); -- if (ch == '\r') -+ if (ch == '\n' && first_line_ended_crlf == TRUE /* and not TRUE_UNSET */ ) -+ /* dot, LF but we are in CRLF mode. Attack? */ -+ ch = ' '; /* replace the LF with a space */ -+ -+ else if (ch == '\r') - { - ch = (receive_getc)(GETC_BUFFER_UNLIMITED); - if (ch != '\n') -@@ -2013,7 +2020,8 @@ for (;;) - ch = (receive_getc)(GETC_BUFFER_UNLIMITED); - if (ch == '\n') - { -- if (first_line_ended_crlf == TRUE_UNSET) first_line_ended_crlf = TRUE; -+ if (first_line_ended_crlf == TRUE_UNSET) -+ first_line_ended_crlf = TRUE; - goto EOL; - } - -@@ -3241,7 +3253,7 @@ if (!ferror(spool_data_file) && !(receive_feof)() && message_ended != END_DOT) - if (smtp_input) - { - message_ended = chunking_state <= CHUNKING_OFFERED -- ? read_message_data_smtp(spool_data_file) -+ ? read_message_data_smtp(spool_data_file, first_line_ended_crlf) - : spool_wireformat - ? read_message_bdat_smtp_wire(spool_data_file) - : read_message_bdat_smtp(spool_data_file); -diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c -index e19c86ff8..aeaffeb37 100644 ---- a/src/src/smtp_in.c -+++ b/src/src/smtp_in.c -@@ -5112,7 +5112,10 @@ while (done <= 0) - to get the DATA command sent. */ - - if (!acl_smtp_predata && cutthrough.cctx.sock < 0) -+ { -+ if (!check_sync()) goto SYNC_FAILURE; - rc = OK; -+ } - else - { - uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept"; |