From fba945cd554175508c4297721f89b8bfd9e80263 Mon Sep 17 00:00:00 2001 From: Eric Allman Date: Wed, 5 May 1993 19:06:32 -0800 Subject: [PATCH] fixes for problems causing mail to be both sent and rejected SCCS-vsn: usr.sbin/sendmail/src/parseaddr.c 6.50 SCCS-vsn: usr.sbin/sendmail/src/srvrsmtp.c 6.52 --- usr/src/usr.sbin/sendmail/src/parseaddr.c | 15 ++++++++++++--- usr/src/usr.sbin/sendmail/src/srvrsmtp.c | 21 ++++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/usr/src/usr.sbin/sendmail/src/parseaddr.c b/usr/src/usr.sbin/sendmail/src/parseaddr.c index 56628d3b52..8d1120631b 100644 --- a/usr/src/usr.sbin/sendmail/src/parseaddr.c +++ b/usr/src/usr.sbin/sendmail/src/parseaddr.c @@ -7,7 +7,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)parseaddr.c 6.49 (Berkeley) %G%"; +static char sccsid[] = "@(#)parseaddr.c 6.50 (Berkeley) %G%"; #endif /* not lint */ #include "sendmail.h" @@ -247,9 +247,11 @@ allocaddr(a, copyf, paddr, delimptr) { char savec = *delimptr; - *delimptr = '\0'; + if (savec != '\0') + *delimptr = '\0'; a->q_paddr = newstr(paddr); - *delimptr = savec; + if (savec != '\0') + *delimptr = savec; } else a->q_paddr = paddr; @@ -383,6 +385,7 @@ prescan(addr, delim, pvpbuf, delimptr) char *tok; int state; int newstate; + char *saveto = CurEnv->e_to; static char *av[MAXATOM+1]; /* make sure error messages don't have garbage on them */ @@ -396,6 +399,7 @@ prescan(addr, delim, pvpbuf, delimptr) state = ATM; c = NOCHAR; p = addr; + CurEnv->e_to = p; if (tTd(22, 11)) { printf("prescan: "); @@ -418,6 +422,7 @@ prescan(addr, delim, pvpbuf, delimptr) usrerr("553 Address too long"); if (delimptr != NULL) *delimptr = p; + CurEnv->e_to = saveto; return (NULL); } @@ -496,6 +501,7 @@ prescan(addr, delim, pvpbuf, delimptr) usrerr("553 Unbalanced ')'"); if (delimptr != NULL) *delimptr = p; + CurEnv->e_to = saveto; return (NULL); } else @@ -512,6 +518,7 @@ prescan(addr, delim, pvpbuf, delimptr) usrerr("553 Unbalanced '>'"); if (delimptr != NULL) *delimptr = p; + CurEnv->e_to = saveto; return (NULL); } anglecnt--; @@ -565,6 +572,7 @@ prescan(addr, delim, pvpbuf, delimptr) syserr("553 prescan: too many tokens"); if (delimptr != NULL) *delimptr = p; + CurEnv->e_to = saveto; return (NULL); } *avp++ = tok; @@ -579,6 +587,7 @@ prescan(addr, delim, pvpbuf, delimptr) printf("prescan==>"); printav(av); } + CurEnv->e_to = saveto; if (av[0] == NULL) return (NULL); return (av); diff --git a/usr/src/usr.sbin/sendmail/src/srvrsmtp.c b/usr/src/usr.sbin/sendmail/src/srvrsmtp.c index ba5b36a717..5deb512d44 100644 --- a/usr/src/usr.sbin/sendmail/src/srvrsmtp.c +++ b/usr/src/usr.sbin/sendmail/src/srvrsmtp.c @@ -10,9 +10,9 @@ #ifndef lint #ifdef SMTP -static char sccsid[] = "@(#)srvrsmtp.c 6.51 (Berkeley) %G% (with SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 6.52 (Berkeley) %G% (with SMTP)"; #else -static char sccsid[] = "@(#)srvrsmtp.c 6.51 (Berkeley) %G% (without SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 6.52 (Berkeley) %G% (without SMTP)"; #endif #endif /* not lint */ @@ -263,6 +263,7 @@ smtp(e) define('r', protocol, e); define('s', sendinghost, e); initsys(e); + nrcpts = 0; setproctitle("%s %s: %s", e->e_id, CurHostName, inp); /* child -- go do the processing */ @@ -415,7 +416,10 @@ smtp(e) /* no errors during parsing, but might be a duplicate */ e->e_to = p; if (!bitset(QBADADDR, a->q_flags)) + { message("250 Recipient ok"); + nrcpts++; + } else { /* punt -- should keep message in ADDRESS.... */ @@ -449,7 +453,7 @@ smtp(e) collect(TRUE, a != NULL, e); e->e_flags &= ~EF_FATALERRS; if (Errors != 0) - break; + goto abortmessage; /* ** Arrange to send to everyone. @@ -470,7 +474,7 @@ smtp(e) */ SmtpPhase = "delivery"; - if (e->e_nrcpts != 1) + if (nrcpts != 1 && a == NULL) { HoldErrs = TRUE; e->e_errormode = EM_MAIL; @@ -490,13 +494,19 @@ smtp(e) /* issue success if appropriate and reset */ if (Errors == 0 || HoldErrs) message("250 %s Message accepted for delivery", id); - if (bitset(EF_FATALERRS, e->e_flags)) + + if (bitset(EF_FATALERRS, e->e_flags) && !HoldErrs) { /* avoid sending back an extra message */ e->e_flags &= ~EF_FATALERRS; + e->e_flags |= EF_CLRQUEUE; } else { + /* from now on, we have to operate silently */ + HoldErrs = TRUE; + e->e_errormode = EM_MAIL; + /* if we just queued, poke it */ if (a != NULL && e->e_sendmode != SM_QUEUE) { @@ -510,6 +520,7 @@ smtp(e) if (!Verbose && e->e_sendmode != SM_QUEUE) dowork(id, TRUE, e); + abortmessage: /* if in a child, pop back to our parent */ if (InChild) finis(); -- 2.20.1