summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/src/acl.c378
-rw-r--r--src/src/queue.c41
-rw-r--r--src/src/rfc2047.c10
-rw-r--r--src/src/transports/smtp.c10
4 files changed, 211 insertions, 228 deletions
diff --git a/src/src/acl.c b/src/src/acl.c
index 13cda1ab4..938bea7d9 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -3018,193 +3018,187 @@ for (; cb; cb = cb->next)
switch(control_type)
{
case CONTROL_AUTH_UNADVERTISED:
- f.allow_auth_unadvertised = TRUE;
- break;
+ f.allow_auth_unadvertised = TRUE;
+ break;
- #ifdef EXPERIMENTAL_BRIGHTMAIL
+#ifdef EXPERIMENTAL_BRIGHTMAIL
case CONTROL_BMI_RUN:
- bmi_run = 1;
- break;
- #endif
+ bmi_run = 1;
+ break;
+#endif
#ifndef DISABLE_DKIM
case CONTROL_DKIM_VERIFY:
- f.dkim_disable_verify = TRUE;
+ f.dkim_disable_verify = TRUE;
# ifdef SUPPORT_DMARC
- /* Since DKIM was blocked, skip DMARC too */
- f.dmarc_disable_verify = TRUE;
- f.dmarc_enable_forensic = FALSE;
+ /* Since DKIM was blocked, skip DMARC too */
+ f.dmarc_disable_verify = TRUE;
+ f.dmarc_enable_forensic = FALSE;
# endif
break;
#endif
#ifdef SUPPORT_DMARC
case CONTROL_DMARC_VERIFY:
- f.dmarc_disable_verify = TRUE;
- break;
+ f.dmarc_disable_verify = TRUE;
+ break;
case CONTROL_DMARC_FORENSIC:
- f.dmarc_enable_forensic = TRUE;
- break;
+ f.dmarc_enable_forensic = TRUE;
+ break;
#endif
case CONTROL_DSCP:
- if (*p == '/')
- {
- int fd, af, level, optname, value;
- /* If we are acting on stdin, the setsockopt may fail if stdin is not
- a socket; we can accept that, we'll just debug-log failures anyway. */
- fd = fileno(smtp_in);
- af = ip_get_address_family(fd);
- if (af < 0)
- {
- HDEBUG(D_acl)
- debug_printf_indent("smtp input is probably not a socket [%s], not setting DSCP\n",
- strerror(errno));
- break;
- }
- if (dscp_lookup(p+1, af, &level, &optname, &value))
+ if (*p == '/')
{
- if (setsockopt(fd, level, optname, &value, sizeof(value)) < 0)
+ int fd, af, level, optname, value;
+ /* If we are acting on stdin, the setsockopt may fail if stdin is not
+ a socket; we can accept that, we'll just debug-log failures anyway. */
+ fd = fileno(smtp_in);
+ if ((af = ip_get_address_family(fd)) < 0)
{
- HDEBUG(D_acl) debug_printf_indent("failed to set input DSCP[%s]: %s\n",
- p+1, strerror(errno));
+ HDEBUG(D_acl)
+ debug_printf_indent("smtp input is probably not a socket [%s], not setting DSCP\n",
+ strerror(errno));
+ break;
}
+ if (dscp_lookup(p+1, af, &level, &optname, &value))
+ if (setsockopt(fd, level, optname, &value, sizeof(value)) < 0)
+ {
+ HDEBUG(D_acl) debug_printf_indent("failed to set input DSCP[%s]: %s\n",
+ p+1, strerror(errno));
+ }
+ else
+ {
+ HDEBUG(D_acl) debug_printf_indent("set input DSCP to \"%s\"\n", p+1);
+ }
else
{
- HDEBUG(D_acl) debug_printf_indent("set input DSCP to \"%s\"\n", p+1);
+ *log_msgptr = string_sprintf("unrecognised DSCP value in \"control=%s\"", arg);
+ return ERROR;
}
}
else
{
- *log_msgptr = string_sprintf("unrecognised DSCP value in \"control=%s\"", arg);
+ *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
return ERROR;
}
- }
- else
- {
- *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
- return ERROR;
- }
- break;
+ break;
case CONTROL_ERROR:
- return ERROR;
+ return ERROR;
case CONTROL_CASEFUL_LOCAL_PART:
- deliver_localpart = addr->cc_local_part;
- break;
+ deliver_localpart = addr->cc_local_part;
+ break;
case CONTROL_CASELOWER_LOCAL_PART:
- deliver_localpart = addr->lc_local_part;
- break;
+ deliver_localpart = addr->lc_local_part;
+ break;
case CONTROL_ENFORCE_SYNC:
- smtp_enforce_sync = TRUE;
- break;
+ smtp_enforce_sync = TRUE;
+ break;
case CONTROL_NO_ENFORCE_SYNC:
- smtp_enforce_sync = FALSE;
- break;
+ smtp_enforce_sync = FALSE;
+ break;
- #ifdef WITH_CONTENT_SCAN
+#ifdef WITH_CONTENT_SCAN
case CONTROL_NO_MBOX_UNSPOOL:
- f.no_mbox_unspool = TRUE;
- break;
- #endif
+ f.no_mbox_unspool = TRUE;
+ break;
+#endif
case CONTROL_NO_MULTILINE:
- f.no_multiline_responses = TRUE;
- break;
+ f.no_multiline_responses = TRUE;
+ break;
case CONTROL_NO_PIPELINING:
- f.pipelining_enable = FALSE;
- break;
+ f.pipelining_enable = FALSE;
+ break;
case CONTROL_NO_DELAY_FLUSH:
- f.disable_delay_flush = TRUE;
- break;
+ f.disable_delay_flush = TRUE;
+ break;
case CONTROL_NO_CALLOUT_FLUSH:
- f.disable_callout_flush = TRUE;
- break;
+ f.disable_callout_flush = TRUE;
+ break;
case CONTROL_FAKEREJECT:
- cancel_cutthrough_connection(TRUE, US"fakereject");
- case CONTROL_FAKEDEFER:
- fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
- if (*p == '/')
- {
- const uschar *pp = p + 1;
- while (*pp) pp++;
- fake_response_text = expand_string(string_copyn(p+1, pp-p-1));
- p = pp;
- }
- else
- {
- /* Explicitly reset to default string */
- fake_response_text = US"Your message has been rejected but is being kept for evaluation.\nIf it was a legitimate message, it may still be delivered to the target recipient(s).";
- }
- break;
+ cancel_cutthrough_connection(TRUE, US"fakereject");
+ case CONTROL_FAKEDEFER:
+ fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
+ if (*p == '/')
+ {
+ const uschar *pp = p + 1;
+ while (*pp) pp++;
+ fake_response_text = expand_string(string_copyn(p+1, pp-p-1));
+ p = pp;
+ }
+ else /* Explicitly reset to default string */
+ fake_response_text = US"Your message has been rejected but is being kept for evaluation.\nIf it was a legitimate message, it may still be delivered to the target recipient(s).";
+ break;
case CONTROL_FREEZE:
- f.deliver_freeze = TRUE;
- deliver_frozen_at = time(NULL);
- freeze_tell = freeze_tell_config; /* Reset to configured value */
- if (Ustrncmp(p, "/no_tell", 8) == 0)
- {
- p += 8;
- freeze_tell = NULL;
- }
- if (*p != 0)
- {
- *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
- return ERROR;
- }
- cancel_cutthrough_connection(TRUE, US"item frozen");
- break;
+ f.deliver_freeze = TRUE;
+ deliver_frozen_at = time(NULL);
+ freeze_tell = freeze_tell_config; /* Reset to configured value */
+ if (Ustrncmp(p, "/no_tell", 8) == 0)
+ {
+ p += 8;
+ freeze_tell = NULL;
+ }
+ if (*p)
+ {
+ *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
+ return ERROR;
+ }
+ cancel_cutthrough_connection(TRUE, US"item frozen");
+ break;
case CONTROL_QUEUE_ONLY:
- f.queue_only_policy = TRUE;
- cancel_cutthrough_connection(TRUE, US"queueing forced");
- break;
+ f.queue_only_policy = TRUE;
+ cancel_cutthrough_connection(TRUE, US"queueing forced");
+ break;
case CONTROL_SUBMISSION:
- originator_name = US"";
- f.submission_mode = TRUE;
- while (*p == '/')
- {
- if (Ustrncmp(p, "/sender_retain", 14) == 0)
- {
- p += 14;
- f.active_local_sender_retain = TRUE;
- f.active_local_from_check = FALSE;
- }
- else if (Ustrncmp(p, "/domain=", 8) == 0)
+ originator_name = US"";
+ f.submission_mode = TRUE;
+ while (*p == '/')
{
- const uschar *pp = p + 8;
- while (*pp && *pp != '/') pp++;
- submission_domain = string_copyn(p+8, pp-p-8);
- p = pp;
+ if (Ustrncmp(p, "/sender_retain", 14) == 0)
+ {
+ p += 14;
+ f.active_local_sender_retain = TRUE;
+ f.active_local_from_check = FALSE;
+ }
+ else if (Ustrncmp(p, "/domain=", 8) == 0)
+ {
+ const uschar *pp = p + 8;
+ while (*pp && *pp != '/') pp++;
+ submission_domain = string_copyn(p+8, pp-p-8);
+ p = pp;
+ }
+ /* The name= option must be last, because it swallows the rest of
+ the string. */
+ else if (Ustrncmp(p, "/name=", 6) == 0)
+ {
+ const uschar *pp = p + 6;
+ while (*pp) pp++;
+ submission_name = string_copy(parse_fix_phrase(p+6, pp-p-6,
+ big_buffer, big_buffer_size));
+ p = pp;
+ }
+ else break;
}
- /* The name= option must be last, because it swallows the rest of
- the string. */
- else if (Ustrncmp(p, "/name=", 6) == 0)
+ if (*p)
{
- const uschar *pp = p + 6;
- while (*pp) pp++;
- submission_name = string_copy(parse_fix_phrase(p+6, pp-p-6,
- big_buffer, big_buffer_size));
- p = pp;
+ *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
+ return ERROR;
}
- else break;
- }
- if (*p != 0)
- {
- *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
- return ERROR;
- }
- break;
+ break;
case CONTROL_DEBUG:
{
@@ -3239,99 +3233,99 @@ for (; cb; cb = cb->next)
debug_logging_stop();
else
debug_logging_activate(debug_tag, debug_opts);
+ break;
}
- break;
case CONTROL_SUPPRESS_LOCAL_FIXUPS:
- f.suppress_local_fixups = TRUE;
- break;
+ f.suppress_local_fixups = TRUE;
+ break;
case CONTROL_CUTTHROUGH_DELIVERY:
- {
- uschar * ignored = NULL;
+ {
+ uschar * ignored = NULL;
#ifndef DISABLE_PRDR
- if (prdr_requested)
+ if (prdr_requested)
#else
- if (0)
+ if (0)
#endif
- /* Too hard to think about for now. We might in future cutthrough
- the case where both sides handle prdr and this-node prdr acl
- is "accept" */
- ignored = US"PRDR active";
- else
- {
- if (f.deliver_freeze)
- ignored = US"frozen";
- else if (f.queue_only_policy)
- ignored = US"queue-only";
- else if (fake_response == FAIL)
- ignored = US"fakereject";
+ /* Too hard to think about for now. We might in future cutthrough
+ the case where both sides handle prdr and this-node prdr acl
+ is "accept" */
+ ignored = US"PRDR active";
else
{
- if (rcpt_count == 1)
+ if (f.deliver_freeze)
+ ignored = US"frozen";
+ else if (f.queue_only_policy)
+ ignored = US"queue-only";
+ else if (fake_response == FAIL)
+ ignored = US"fakereject";
+ else
{
- cutthrough.delivery = TRUE; /* control accepted */
- while (*p == '/')
+ if (rcpt_count == 1)
{
- const uschar * pp = p+1;
- if (Ustrncmp(pp, "defer=", 6) == 0)
+ cutthrough.delivery = TRUE; /* control accepted */
+ while (*p == '/')
{
- pp += 6;
- if (Ustrncmp(pp, "pass", 4) == 0) cutthrough.defer_pass = TRUE;
- /* else if (Ustrncmp(pp, "spool") == 0) ; default */
+ const uschar * pp = p+1;
+ if (Ustrncmp(pp, "defer=", 6) == 0)
+ {
+ pp += 6;
+ if (Ustrncmp(pp, "pass", 4) == 0) cutthrough.defer_pass = TRUE;
+ /* else if (Ustrncmp(pp, "spool") == 0) ; default */
+ }
+ else
+ while (*pp && *pp != '/') pp++;
+ p = pp;
}
- else
- while (*pp && *pp != '/') pp++;
- p = pp;
}
+ else
+ ignored = US"nonfirst rcpt";
}
- else
- ignored = US"nonfirst rcpt";
}
+ DEBUG(D_acl) if (ignored)
+ debug_printf(" cutthrough request ignored on %s item\n", ignored);
}
- DEBUG(D_acl) if (ignored)
- debug_printf(" cutthrough request ignored on %s item\n", ignored);
- }
break;
#ifdef SUPPORT_I18N
case CONTROL_UTF8_DOWNCONVERT:
- if (*p == '/')
- {
- if (p[1] == '1')
+ if (*p == '/')
{
- message_utf8_downconvert = 1;
- addr->prop.utf8_downcvt = TRUE;
- addr->prop.utf8_downcvt_maybe = FALSE;
- p += 2;
- break;
+ if (p[1] == '1')
+ {
+ message_utf8_downconvert = 1;
+ addr->prop.utf8_downcvt = TRUE;
+ addr->prop.utf8_downcvt_maybe = FALSE;
+ p += 2;
+ break;
+ }
+ if (p[1] == '0')
+ {
+ message_utf8_downconvert = 0;
+ addr->prop.utf8_downcvt = FALSE;
+ addr->prop.utf8_downcvt_maybe = FALSE;
+ p += 2;
+ break;
+ }
+ if (p[1] == '-' && p[2] == '1')
+ {
+ message_utf8_downconvert = -1;
+ addr->prop.utf8_downcvt = FALSE;
+ addr->prop.utf8_downcvt_maybe = TRUE;
+ p += 3;
+ break;
+ }
+ *log_msgptr = US"bad option value for control=utf8_downconvert";
}
- if (p[1] == '0')
+ else
{
- message_utf8_downconvert = 0;
- addr->prop.utf8_downcvt = FALSE;
+ message_utf8_downconvert = 1;
+ addr->prop.utf8_downcvt = TRUE;
addr->prop.utf8_downcvt_maybe = FALSE;
- p += 2;
- break;
- }
- if (p[1] == '-' && p[2] == '1')
- {
- message_utf8_downconvert = -1;
- addr->prop.utf8_downcvt = FALSE;
- addr->prop.utf8_downcvt_maybe = TRUE;
- p += 3;
break;
}
- *log_msgptr = US"bad option value for control=utf8_downconvert";
- }
- else
- {
- message_utf8_downconvert = 1;
- addr->prop.utf8_downcvt = TRUE;
- addr->prop.utf8_downcvt_maybe = FALSE;
- break;
- }
- return ERROR;
+ return ERROR;
#endif
}
diff --git a/src/src/queue.c b/src/src/queue.c
index a57801426..f808ed103 100644
--- a/src/src/queue.c
+++ b/src/src/queue.c
@@ -1421,33 +1421,26 @@ queue_check_only(void)
{
int sep = 0;
struct stat statbuf;
-const uschar *s;
-uschar *ss;
-uschar buffer[1024];
+const uschar * s = queue_only_file;
+uschar * ss;
-if (queue_only_file == NULL) return;
-
-s = queue_only_file;
-while ((ss = string_nextinlist(&s, &sep, buffer, sizeof(buffer))) != NULL)
- {
- if (Ustrncmp(ss, "smtp", 4) == 0)
- {
- ss += 4;
- if (Ustat(ss, &statbuf) == 0)
- {
- f.queue_smtp = TRUE;
- DEBUG(D_receive) debug_printf("queue_smtp set because %s exists\n", ss);
- }
- }
- else
- {
- if (Ustat(ss, &statbuf) == 0)
+if (s)
+ while ((ss = string_nextinlist(&s, &sep, NULL, 0)))
+ if (Ustrncmp(ss, "smtp", 4) == 0)
{
- queue_only = TRUE;
- DEBUG(D_receive) debug_printf("queue_only set because %s exists\n", ss);
+ ss += 4;
+ if (Ustat(ss, &statbuf) == 0)
+ {
+ f.queue_smtp = TRUE;
+ DEBUG(D_receive) debug_printf("queue_smtp set because %s exists\n", ss);
+ }
}
- }
- }
+ else
+ if (Ustat(ss, &statbuf) == 0)
+ {
+ queue_only = TRUE;
+ DEBUG(D_receive) debug_printf("queue_only set because %s exists\n", ss);
+ }
}
#endif /*!COMPILE_UTILITY*/
diff --git a/src/src/rfc2047.c b/src/src/rfc2047.c
index f7085007a..039c8493e 100644
--- a/src/src/rfc2047.c
+++ b/src/src/rfc2047.c
@@ -233,17 +233,11 @@ while (mimeword)
#if HAVE_ICONV
*q1 = 0;
- if (target != NULL && strcmpic(target, mimeword+2) != 0)
- {
- icd = iconv_open(CS target, CS(mimeword+2));
-
- if (icd == (iconv_t)(-1))
- {
+ if (target && strcmpic(target, mimeword+2) != 0)
+ if ((icd = iconv_open(CS target, CS(mimeword+2))) == (iconv_t)-1)
*error = string_sprintf("iconv_open(\"%s\", \"%s\") failed: %s%s",
target, mimeword+2, strerror(errno),
(errno == EINVAL)? " (maybe unsupported conversion)" : "");
- }
- }
*q1 = '?';
#endif
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 58fe055b7..6559d4170 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -4866,10 +4866,12 @@ retry_non_continued:
were not in it. We don't want to hold up all SMTP deliveries! Except when
doing a two-stage queue run, don't do this if forcing. */
- if ((!f.deliver_force || f.queue_2stage) && (f.queue_smtp ||
- match_isinlist(addrlist->domain,
- (const uschar **)&queue_smtp_domains, 0,
- &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK))
+ if ( (!f.deliver_force || f.queue_2stage)
+ && ( f.queue_smtp
+ || match_isinlist(addrlist->domain,
+ CUSS &queue_smtp_domains, 0,
+ &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
+ )
{
expired = FALSE;
for (address_item * addr = addrlist; addr; addr = addr->next)