From f9cde90e59a561079a5a5399c0c853c4b427b92d Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Mon, 1 Sep 2014 08:48:08 +0000
Subject: [PATCH] Better handling of pass-through external mail processors. Now
 using a local-scope variable for temporary mailproc pointer. Log a warning
 when external mail processor creates an error drop file.

---
 src/sbbs3/mailsrvr.c | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 6fe9ab72c8..649c1154d0 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -2635,55 +2635,51 @@ static void smtp_thread(void* arg)
 					SAFEPRINTF2(proc_err_fname,"%sSBBS_SMTP.%s.err", scfg.temp_dir, session_id);
 					remove(proc_err_fname);
 
-					for(i=0;i<mailproc_count;i++) {
-	
-						mailproc=&mailproc_list[i];
-						if(mailproc->disabled)
+					for(i=0;i<mailproc_count && !msg_handled;i++) {
+						struct mailproc* mp=&mailproc_list[i];
+						if(mp->disabled)
 							continue;
 
-						if(!mailproc->process_dnsbl && dnsbl_result.s_addr)
+						if(!mp->process_dnsbl && dnsbl_result.s_addr)
 							continue;
 
-						if(!mailproc->process_spam && spam_bait_result)
+						if(!mp->process_spam && spam_bait_result)
 							continue;
 
-						if(!chk_ar(&scfg,mailproc->ar,&relay_user,&client))
+						if(!chk_ar(&scfg,mp->ar,&relay_user,&client))
 							continue;
 
-						if(mailproc->to!=NULL && !mailproc_to_match[i])
+						if(mp->to!=NULL && !mailproc_to_match[i])
 							continue;
 
-						if(mailproc->from!=NULL 
-							&& !findstr_in_list(sender_addr, mailproc->from))
+						if(mp->from!=NULL 
+							&& !findstr_in_list(sender_addr, mp->from))
 							continue;
 
-						if(!mailproc->passthru)
-							msg_handled=TRUE;
-
-						mailcmdstr(mailproc->cmdline
+						mailcmdstr(mp->cmdline
 							,msgtxt_fname, newtxt_fname, logtxt_fname
 							,rcptlst_fname, proc_err_fname
 							,host_name, host_ip, relay_user.number
 							,rcpt_addr
 							,sender, sender_addr, reverse_path, str);
 						lprintf(LOG_INFO,"%04d SMTP Executing external mail processor: %s"
-							,socket, mailproc->name);
+							,socket, mp->name);
 
-						if(mailproc->native) {
+						if(mp->native) {
 							lprintf(LOG_DEBUG,"%04d SMTP Executing external command: %s"
 								,socket, str);
 							if((j=system(str))!=0) {
 								lprintf(LOG_NOTICE,"%04d SMTP system(%s) returned %d (errno: %d)"
 									,socket, str, j, errno);
-								if(mailproc->ignore_on_error) {
+								if(mp->ignore_on_error) {
 									lprintf(LOG_WARNING,"%04d !SMTP IGNORED MAIL due to mail processor (%s) error: %d"
-										,socket, mailproc->name, j);
+										,socket, mp->name, j);
 									msg_handled=TRUE;
 								}
 							}
 						} else {  /* JavaScript */
 							if(!js_mailproc(socket, &client, &relay_user
-								,mailproc
+								,mp
 								,str /* cmdline */
 								,msgtxt_fname, newtxt_fname, logtxt_fname
 								,rcpt_addr
@@ -2702,13 +2698,16 @@ static void smtp_thread(void* arg)
 #endif
 							}
 						}
-						if(flength(proc_err_fname)>0)
-							break;
-						if(!fexist(msgtxt_fname) || !fexist(rcptlst_fname))
+						if(!mp->passthru || flength(proc_err_fname)>0 || !fexist(msgtxt_fname) || !fexist(rcptlst_fname)) {
+							mailproc=mp;
+							msg_handled=TRUE;
 							break;
+						}
 					}
 					if(flength(proc_err_fname)>0 
 						&& (proc_err=fopen(proc_err_fname,"r"))!=NULL) {
+						lprintf(LOG_WARNING,"%04d !SMTP External mail processor (%s) created: %s"
+								,socket, mailproc->name, proc_err_fname);
 						while(!feof(proc_err)) {
 							int n;
 							if(!fgets(str,sizeof(str),proc_err))
-- 
GitLab