changeset 812:58a2cba0be3e

Fix potential crash when mail to the owner arrives with no From: header.
author Ben Schmidt
date Mon, 16 Jan 2012 21:30:29 +1100
parents 262752ddbbf5
children 74d5ebb67b34
files ChangeLog src/mlmmj-process.c
diffstat 2 files changed, 25 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Jan 16 21:30:27 2012 +1100
+++ b/ChangeLog	Mon Jan 16 21:30:29 2012 +1100
@@ -1,3 +1,4 @@
+ o Fix potential crash when mail to the owner arrives with no From: header
  o Add %originalmail% directive and restore backward compatibility of
    $originalmail$
  o Allow more characters in control and text filenames for substitutions
--- a/src/mlmmj-process.c	Mon Jan 16 21:30:27 2012 +1100
+++ b/src/mlmmj-process.c	Mon Jan 16 21:30:29 2012 +1100
@@ -569,6 +569,30 @@
 	for(i = 0; i < readhdrs[0].valuecount; i++) {
 		find_email_adr(readhdrs[0].values[i], &fromemails);
 	}
+	/* discard malformed mail with invalid From: unless it's a bounce */
+	if(fromemails.emailcount != 1 &&
+			(recipextra == NULL ||
+			strncmp(recipextra, "bounces", 7) != 0)) {
+		for(i = 0; i < fromemails.emailcount; i++)
+			printf("fromemails.emaillist[%d] = %s\n",
+					i, fromemails.emaillist[i]);
+		discardname = concatstr(3, listdir,
+				"/queue/discarded/", randomstr);
+		log_error(LOG_ARGS, "Discarding %s due to invalid From:",
+				mailfile);
+		for(i = 0; i < fromemails.emailcount; i++)
+			log_error(LOG_ARGS, "fromemails.emaillist[%d] = %s\n",
+					i, fromemails.emaillist[i]);
+		rename(mailfile, discardname);
+		unlink(donemailname);
+		myfree(donemailname);
+		myfree(discardname);
+		myfree(randomstr);
+		/* TODO: free emailstructs */
+		exit(EXIT_SUCCESS);
+	}
+	maildata[3] = fromemails.emaillist[0];
+
 	if (fromemails.emailcount)
 		maildata[3] = fromemails.emaillist[0];
 
@@ -757,27 +781,6 @@
 		}
 	}
 
-	/* discard malformed mail with invalid From: */
-	if(fromemails.emailcount != 1) {
-		for(i = 0; i < fromemails.emailcount; i++)
-			printf("fromemails.emaillist[%d] = %s\n",
-					i, fromemails.emaillist[i]);
-		discardname = concatstr(3, listdir,
-				"/queue/discarded/", randomstr);
-		log_error(LOG_ARGS, "Discarding %s due to invalid From:",
-				mailfile);
-		for(i = 0; i < fromemails.emailcount; i++)
-			log_error(LOG_ARGS, "fromemails.emaillist[%d] = %s\n",
-					i, fromemails.emaillist[i]);
-		rename(mailfile, discardname);
-		unlink(donemailname);
-		myfree(donemailname);
-		myfree(discardname);
-		myfree(randomstr);
-		/* TODO: free emailstructs */
-		exit(EXIT_SUCCESS);
-	}
-
 	myfree(delheaders);
 
 	if(strcmp(efrom, "") == 0) { /* don't send mails with <> in From