aboutsummaryrefslogtreecommitdiff
path: root/contrib/sendmail/src/milter.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/src/milter.c')
-rw-r--r--contrib/sendmail/src/milter.c96
1 files changed, 55 insertions, 41 deletions
diff --git a/contrib/sendmail/src/milter.c b/contrib/sendmail/src/milter.c
index ba783c4c61db..215a52003a00 100644
--- a/contrib/sendmail/src/milter.c
+++ b/contrib/sendmail/src/milter.c
@@ -16,6 +16,9 @@ SM_RCSID("@(#)$Id: milter.c,v 8.281 2013-11-22 20:51:56 ca Exp $")
# include <sm/sendmail.h>
# include <libmilter/mfapi.h>
# include <libmilter/mfdef.h>
+# if _FFR_8BITENVADDR
+# include <sm/ixlen.h>
+# endif
# include <errno.h>
# include <sm/time.h>
@@ -175,11 +178,7 @@ static size_t MilterMaxDataSize = MILTER_MAX_DATA_SIZE;
sm_syslog(LOG_ERR, e->e_id, msg, dfname, sm_errstring(save_errno)); \
if (SuperSafe == SAFE_REALLY) \
{ \
- if (e->e_dfp != NULL) \
- { \
- (void) sm_io_close(e->e_dfp, SM_TIME_DEFAULT); \
- e->e_dfp = NULL; \
- } \
+ SM_CLOSE_FP(e->e_dfp); \
e->e_flags &= ~EF_HAS_DF; \
} \
errno = save_errno; \
@@ -537,8 +536,9 @@ milter_write(m, cmd, buf, len, to, e, where)
{
if (tTd(64, 5))
{
- sm_dprintf("milter_write(%s): length %ld out of range, cmd=%c\n",
- m->mf_name, (long) len, command);
+ sm_dprintf("milter_write(%s): length %ld out of range, mds=%ld, cmd=%c\n",
+ m->mf_name, (long) len,
+ (long) MilterMaxDataSize, command);
sm_dprintf("milter_write(%s): buf=%s\n",
m->mf_name, str2prt(buf));
}
@@ -661,7 +661,7 @@ milter_open(m, parseonly, e)
struct hostent *hp = NULL;
SOCKADDR addr;
- if (m->mf_conn == NULL || m->mf_conn[0] == '\0')
+ if (SM_IS_EMPTY(m->mf_conn))
{
if (tTd(64, 5))
sm_dprintf("X%s: empty or missing socket information\n",
@@ -711,16 +711,16 @@ milter_open(m, parseonly, e)
# endif /* NETUNIX */
}
# if NETUNIX
- else if (sm_strcasecmp(p, "unix") == 0 ||
- sm_strcasecmp(p, "local") == 0)
+ else if (SM_STRCASEEQ(p, "unix") ||
+ SM_STRCASEEQ(p, "local"))
addr.sa.sa_family = AF_UNIX;
# endif
# if NETINET
- else if (sm_strcasecmp(p, "inet") == 0)
+ else if (SM_STRCASEEQ(p, "inet"))
addr.sa.sa_family = AF_INET;
# endif
# if NETINET6
- else if (sm_strcasecmp(p, "inet6") == 0)
+ else if (SM_STRCASEEQ(p, "inet6"))
addr.sa.sa_family = AF_INET6;
# endif
else
@@ -1249,11 +1249,11 @@ milter_setup(line)
m->mf_timeout[SMFTO_WRITE] = (time_t) 10;
m->mf_timeout[SMFTO_READ] = (time_t) 10;
m->mf_timeout[SMFTO_EOM] = (time_t) 300;
-#if _FFR_MILTER_CHECK
+# if _FFR_MILTER_CHECK
m->mf_mta_prot_version = SMFI_PROT_VERSION;
m->mf_mta_prot_flags = SMFI_CURR_PROT;
m->mf_mta_actions = SMFI_CURR_ACTS;
-#endif /* _FFR_MILTER_CHECK */
+# endif /* _FFR_MILTER_CHECK */
/* now scan through and assign info from the fields */
while (*p != '\0')
@@ -1271,6 +1271,8 @@ milter_setup(line)
if (*p++ != '=')
{
syserr("X%s: `=' expected", m->mf_name);
+ /* this should not be reached, but just in case */
+ SM_FREE(m);
return;
}
while (SM_ISSPACE(*p))
@@ -1301,7 +1303,7 @@ milter_setup(line)
milter_parse_timeouts(p, m);
break;
-#if _FFR_MILTER_CHECK
+# if _FFR_MILTER_CHECK
case 'a':
m->mf_mta_actions = strtoul(p, NULL, 0);
break;
@@ -1311,7 +1313,7 @@ milter_setup(line)
case 'v':
m->mf_mta_prot_version = strtoul(p, NULL, 0);
break;
-#endif /* _FFR_MILTER_CHECK */
+# endif /* _FFR_MILTER_CHECK */
default:
syserr("X%s: unknown filter equate %c=",
@@ -1601,7 +1603,7 @@ milter_set_option(name, val, sticky)
for (mo = MilterOptTab; mo->mo_name != NULL; mo++)
{
- if (sm_strcasecmp(mo->mo_name, name) == 0)
+ if (SM_STRCASEEQ(mo->mo_name, name))
break;
}
@@ -1710,7 +1712,7 @@ milter_reopen_df(e)
/* close read-only data file */
if (bitset(EF_HAS_DF, e->e_flags) && e->e_dfp != NULL)
{
- (void) sm_io_close(e->e_dfp, SM_TIME_DEFAULT);
+ SM_CLOSE_FP(e->e_dfp);
e->e_flags &= ~EF_HAS_DF;
}
@@ -1891,7 +1893,7 @@ milter_send_macros(m, macros, cmd, e)
ssize_t s;
/* sanity check */
- if (macros == NULL || macros[0] == NULL)
+ if (NULL == macros || NULL == macros[0])
return;
/* put together data */
@@ -1905,7 +1907,13 @@ milter_send_macros(m, macros, cmd, e)
if (v == NULL)
continue;
expand(v, exp, sizeof(exp), e);
- s += strlen(macros[i]) + 1 + strlen(exp) + 1;
+ s += strlen(macros[i]) + 1 +
+# if _FFR_8BITENVADDR
+ ilenx(exp)
+# else
+ strlen(exp)
+# endif
+ + 1;
}
if (s < 0)
@@ -1923,6 +1931,9 @@ milter_send_macros(m, macros, cmd, e)
if (v == NULL)
continue;
expand(v, exp, sizeof(exp), e);
+# if _FFR_8BITENVADDR
+ dequote_internal_chars(exp, exp, sizeof(exp));
+# endif
if (tTd(64, 10))
sm_dprintf("milter_send_macros(%s, %c): %s=%s\n",
@@ -2385,21 +2396,21 @@ milter_negotiate(m, e, milters)
return -1;
}
-#if _FFR_MILTER_CHECK
+# if _FFR_MILTER_CHECK
mta_prot_vers = m->mf_mta_prot_version;
mta_prot_flags = m->mf_mta_prot_flags;
mta_actions = m->mf_mta_actions;
-#else /* _FFR_MILTER_CHECK */
+# else /* _FFR_MILTER_CHECK */
mta_prot_vers = SMFI_PROT_VERSION;
mta_prot_flags = SMFI_CURR_PROT;
mta_actions = SMFI_CURR_ACTS;
-#endif /* _FFR_MILTER_CHECK */
-#if _FFR_MDS_NEGOTIATE
+# endif /* _FFR_MILTER_CHECK */
+# if _FFR_MDS_NEGOTIATE
if (MilterMaxDataSize == MILTER_MDS_256K)
mta_prot_flags |= SMFIP_MDS_256K;
else if (MilterMaxDataSize == MILTER_MDS_1M)
mta_prot_flags |= SMFIP_MDS_1M;
-#endif /* _FFR_MDS_NEGOTIATE */
+# endif /* _FFR_MDS_NEGOTIATE */
fvers = htonl(mta_prot_vers);
pflags = htonl(mta_prot_flags);
@@ -2424,7 +2435,10 @@ milter_negotiate(m, e, milters)
response = milter_read(m, &rcmd, &rlen, m->mf_timeout[SMFTO_READ], e,
"negotiate");
if (m->mf_state == SMFS_ERROR)
+ {
+ SM_FREE(response);
return -1;
+ }
if (rcmd != SMFIC_OPTNEG)
{
@@ -2513,8 +2527,8 @@ milter_negotiate(m, e, milters)
goto error;
}
-#if _FFR_MDS_NEGOTIATE
-#define MDSWARNING(sz) \
+# if _FFR_MDS_NEGOTIATE
+# define MDSWARNING(sz) \
do \
{ \
sm_syslog(LOG_WARNING, NOQID, \
@@ -2545,7 +2559,7 @@ milter_negotiate(m, e, milters)
else if (MilterMaxDataSize != MILTER_MDS_64K)
MDSWARNING(MILTER_MDS_64K);
m->mf_pflags &= ~SMFI_INTERNAL;
-#endif /* _FFR_MDS_NEGOTIATE */
+# endif /* _FFR_MDS_NEGOTIATE */
/* check for protocol feature mismatch */
if ((m->mf_pflags & mta_prot_flags) != m->mf_pflags)
@@ -2785,10 +2799,10 @@ milter_body(m, e, state)
/* Change LF to CRLF */
if (c == '\n')
{
-#if !_FFR_MILTER_CONVERT_ALL_LF_TO_CRLF
+# if !_FFR_MILTER_CONVERT_ALL_LF_TO_CRLF
/* Not a CRLF already? */
if (prevchar != '\r')
-#endif
+# endif
{
/* Room for CR now? */
if (bp + 2 > &buf[sizeof(buf)])
@@ -2973,14 +2987,14 @@ milter_addheader(m, response, rlen, e)
for (h = e->e_header; h != NULL; h = h->h_link)
{
- if (sm_strcasecmp(h->h_field, response) == 0 &&
+ if (SM_STRCASEEQ(h->h_field, response) &&
!bitset(H_USER, h->h_flags) &&
!bitset(H_TRACE, h->h_flags))
break;
}
mh_v_len = 0;
- mh_value = quote_internal_chars(val, NULL, &mh_v_len);
+ mh_value = quote_internal_chars(val, NULL, &mh_v_len, NULL);
/* add to e_msgsize */
e->e_msgsize += strlen(response) + 2 + strlen(val);
@@ -2995,7 +3009,7 @@ milter_addheader(m, response, rlen, e)
"Milter (%s) change: default header %s value with %s",
m->mf_name, h->h_field, mh_value);
if (bitset(SMFIP_HDR_LEADSPC, m->mf_pflags))
- h->h_value = mh_value;
+ h->h_value = mh_value; /* XXX must be allocated from rpool? */
else
{
h->h_value = addleadingspace(mh_value, e->e_rpool);
@@ -3096,7 +3110,7 @@ milter_insheader(m, response, rlen, e)
"Milter (%s) insert (%d): header: %s: %s",
m->mf_name, idx, field, val);
mh_v_len = 0;
- mh_value = quote_internal_chars(val, NULL, &mh_v_len);
+ mh_value = quote_internal_chars(val, NULL, &mh_v_len, NULL);
insheader(idx, newstr(field), mh_value, H_USER, e,
!bitset(SMFIP_HDR_LEADSPC, m->mf_pflags));
SM_FREE(mh_value);
@@ -3168,12 +3182,12 @@ milter_changeheader(m, response, rlen, e)
}
mh_v_len = 0;
- mh_value = quote_internal_chars(val, NULL, &mh_v_len);
+ mh_value = quote_internal_chars(val, NULL, &mh_v_len, NULL);
sysheader = NULL;
for (h = e->e_header; h != NULL; h = h->h_link)
{
- if (sm_strcasecmp(h->h_field, field) == 0)
+ if (SM_STRCASEEQ(h->h_field, field))
{
if (bitset(H_USER, h->h_flags) && --index <= 0)
{
@@ -3300,7 +3314,7 @@ milter_changeheader(m, response, rlen, e)
else
{
if (bitset(SMFIP_HDR_LEADSPC, m->mf_pflags))
- h->h_value = mh_value;
+ h->h_value = mh_value; /* XXX must be allocated from rpool? */
else
{
h->h_value = addleadingspace(mh_value, e->e_rpool);
@@ -3515,6 +3529,7 @@ milter_addrcpt_par(response, rlen, e, mname)
olderrors = Errors;
/* how to set ESMTP arguments? */
+/* XXX argv[0] must be [i] */
a = parseaddr(argv[0], NULLADDR, RF_COPYALL, ' ', &delimptr, e, true);
if (a != NULL && olderrors == Errors)
@@ -3998,7 +4013,7 @@ milter_connect(hostname, addr, e, state)
else
milter_per_connection_check(e);
-#if !_FFR_MILTER_CONNECT_REPLYCODE
+# if !_FFR_MILTER_CONNECT_REPLYCODE
/*
** SMFIR_REPLYCODE can't work with connect due to
** the requirements of SMTP. Therefore, ignore the
@@ -4023,7 +4038,7 @@ milter_connect(hostname, addr, e, state)
response = NULL;
}
}
-#endif /* !_FFR_MILTER_CONNECT_REPLYCODE */
+# endif /* !_FFR_MILTER_CONNECT_REPLYCODE */
return response;
}
@@ -4683,8 +4698,7 @@ finishup:
if (dfopen)
{
- (void) sm_io_close(e->e_dfp, SM_TIME_DEFAULT);
- e->e_dfp = NULL;
+ SM_CLOSE_FP(e->e_dfp);
e->e_flags &= ~EF_HAS_DF;
dfopen = false;
}