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