summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sendmail/src/parseaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/sendmail/src/parseaddr.c')
-rw-r--r--usr.sbin/sendmail/src/parseaddr.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/usr.sbin/sendmail/src/parseaddr.c b/usr.sbin/sendmail/src/parseaddr.c
index a10c329..258e0a9 100644
--- a/usr.sbin/sendmail/src/parseaddr.c
+++ b/usr.sbin/sendmail/src/parseaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1983, 1995, 1996 Eric P. Allman
+ * Copyright (c) 1983, 1995-1997 Eric P. Allman
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
@@ -33,7 +33,7 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)parseaddr.c 8.115 (Berkeley) 11/24/96";
+static char sccsid[] = "@(#)parseaddr.c 8.128 (Berkeley) 6/14/97";
#endif /* not lint */
# include "sendmail.h"
@@ -220,6 +220,11 @@ invalidaddr(addr, delimptr)
if (savedelim != '\0')
*delimptr = '\0';
}
+ if (strlen(addr) > TOBUFSIZE - 2)
+ {
+ usrerr("553 Address too long (%d bytes max)", TOBUFSIZE - 2);
+ goto failure;
+ }
for (; *addr != '\0'; addr++)
{
if ((*addr & 0340) == 0200)
@@ -233,6 +238,7 @@ invalidaddr(addr, delimptr)
}
setstat(EX_USAGE);
usrerr("553 Address contained invalid control characters");
+failure:
if (delimptr != NULL && savedelim != '\0')
*delimptr = savedelim;
return TRUE;
@@ -756,6 +762,7 @@ rewrite(pvp, ruleset, reclevel, e)
struct match mlist[MAXMATCH]; /* stores match on LHS */
char *npvp[MAXATOM+1]; /* temporary space for rebuild */
extern int callsubr __P((char**, int, ENVELOPE *));
+ extern int sm_strcasecmp __P((char *, char *));
if (OpMode == MD_TEST || tTd(21, 1))
{
@@ -930,7 +937,7 @@ rewrite(pvp, ruleset, reclevel, e)
default:
/* must have exact match */
- if (strcasecmp(rp, ap))
+ if (sm_strcasecmp(rp, ap))
goto backup;
avp++;
break;
@@ -1436,7 +1443,7 @@ map_lookup(map, key, argvect, pstat, e)
map->s_name, key, errno);
if (e->e_message == NULL)
{
- char mbuf[300];
+ char mbuf[320];
snprintf(mbuf, sizeof mbuf,
"%.80s map: lookup (%s): deferred",
@@ -2106,6 +2113,10 @@ remotename(name, m, flags, pstat, e)
** none.
*/
+#define Q_COPYFLAGS (QPRIMARY|QBOGUSSHELL|QUNSAFEADDR|\
+ Q_PINGFLAGS|QHASNOTIFY|\
+ QRELAYED|QEXPANDED|QDELIVERED|QDELAYED)
+
void
maplocaluser(a, sendq, aliaslevel, e)
register ADDRESS *a;
@@ -2127,6 +2138,10 @@ maplocaluser(a, sendq, aliaslevel, e)
if (pvp == NULL)
return;
+ define('h', a->q_host, e);
+ define('u', a->q_user, e);
+ define('z', a->q_home, e);
+
if (rewrite(pvp, 5, 0, e) == EX_TEMPFAIL)
{
a->q_flags |= QQUEUEUP;
@@ -2139,7 +2154,16 @@ maplocaluser(a, sendq, aliaslevel, e)
/* if non-null, mailer destination specified -- has it changed? */
a1 = buildaddr(pvp, NULL, 0, e);
if (a1 == NULL || sameaddr(a, a1))
+ {
+ if (a1 != NULL)
+ free(a1);
return;
+ }
+
+ /* make new address take on flags and print attributes of old */
+ a1->q_flags &= ~Q_COPYFLAGS;
+ a1->q_flags |= a->q_flags & Q_COPYFLAGS;
+ a1->q_paddr = a->q_paddr;
/* mark old address as dead; insert new address */
a->q_flags |= QDONTSEND;
@@ -2324,6 +2348,8 @@ rscheck(rwset, p1, p2, e)
int rsno;
auto ADDRESS a1;
bool saveQuickAbort = QuickAbort;
+ bool saveSuprErrs = SuprErrs;
+ bool saveOnlyOneError = OnlyOneError;
char buf0[MAXLINE];
char pvpbuf[PSBUFSIZE];
extern char MsgBuf[];
@@ -2360,44 +2386,52 @@ rscheck(rwset, p1, p2, e)
}
(void) snprintf(buf, bufsize, "%s", p1);
}
+ SuprErrs = TRUE;
+ OnlyOneError = QuickAbort = FALSE;
pvp = prescan(buf, '\0', pvpbuf, sizeof pvpbuf, NULL, NULL);
+ SuprErrs = saveSuprErrs;
if (pvp == NULL)
{
+ syserr("rscheck: cannot prescan input: \"%s\"",
+ shortenstring(buf, 203));
rstat = EX_DATAERR;
goto finis;
}
(void) rewrite(pvp, rsno, 0, e);
if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET ||
pvp[1] == NULL || strcmp(pvp[1], "error") != 0)
- return EX_OK;
+ {
+ rstat = EX_OK;
+ goto finis;
+ }
/* got an error -- process it */
saveexitstat = ExitStat;
- QuickAbort = FALSE;
(void) buildaddr(pvp, &a1, 0, e);
- QuickAbort = saveQuickAbort;
rstat = ExitStat;
ExitStat = saveexitstat;
-#ifdef LOG
if (LogLevel >= 4)
{
if (p2 == NULL)
- syslog(LOG_NOTICE, "Ruleset %s (%s) rejection: %s",
+ sm_syslog(LOG_NOTICE, e->e_id,
+ "Ruleset %s (%s) rejection: %s",
rwset, p1, MsgBuf);
else
- syslog(LOG_NOTICE, "Ruleset %s (%s, %s) rejection: %s",
+ sm_syslog(LOG_NOTICE, e->e_id,
+ "Ruleset %s (%s, %s) rejection: %s",
rwset, p1, p2, MsgBuf);
}
-#endif
-
- if (QuickAbort)
- longjmp(TopFrame, 2);
- /* clean up */
finis:
+ /* clean up */
+ QuickAbort = saveQuickAbort;
+ OnlyOneError = saveOnlyOneError;
setstat(rstat);
if (buf != buf0)
free(buf);
+
+ if (rstat != EX_OK && (QuickAbort || (OnlyOneError && !HoldErrs)))
+ longjmp(TopFrame, 2);
return rstat;
}
OpenPOWER on IntegriCloud