From: Ben Schmidt Date: Mon, 16 Jan 2012 10:30:29 +0000 (+1100) Subject: Fix potential crash when mail to the owner arrives with no From: header. X-Git-Tag: RELEASE_1_2_18a1~53 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4da93ec70be0a19c5c8f116fbef4bbb966a16b7;p=thirdparty%2Fmlmmj.git Fix potential crash when mail to the owner arrives with no From: header. --- diff --git a/ChangeLog b/ChangeLog index 925ed56a..ec978a22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/src/mlmmj-process.c b/src/mlmmj-process.c index d9812ec7..f2a90ac7 100644 --- a/src/mlmmj-process.c +++ b/src/mlmmj-process.c @@ -569,6 +569,30 @@ int main(int argc, char **argv) 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 @@ int main(int argc, char **argv) } } - /* 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