fixes for problems causing mail to be both sent and rejected
authorEric Allman <eric@ucbvax.Berkeley.EDU>
Thu, 6 May 1993 03:06:32 +0000 (19:06 -0800)
committerEric Allman <eric@ucbvax.Berkeley.EDU>
Thu, 6 May 1993 03:06:32 +0000 (19:06 -0800)
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
usr/src/usr.sbin/sendmail/src/srvrsmtp.c

index 56628d3..8d11206 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 #ifndef lint
  */
 
 #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"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -247,9 +247,11 @@ allocaddr(a, copyf, paddr, delimptr)
        {
                char savec = *delimptr;
 
        {
                char savec = *delimptr;
 
-               *delimptr = '\0';
+               if (savec != '\0')
+                       *delimptr = '\0';
                a->q_paddr = newstr(paddr);
                a->q_paddr = newstr(paddr);
-               *delimptr = savec;
+               if (savec != '\0')
+                       *delimptr = savec;
        }
        else
                a->q_paddr = paddr;
        }
        else
                a->q_paddr = paddr;
@@ -383,6 +385,7 @@ prescan(addr, delim, pvpbuf, delimptr)
        char *tok;
        int state;
        int newstate;
        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 */
        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;
        state = ATM;
        c = NOCHAR;
        p = addr;
+       CurEnv->e_to = p;
        if (tTd(22, 11))
        {
                printf("prescan: ");
        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;
                                        usrerr("553 Address too long");
                                        if (delimptr != NULL)
                                                *delimptr = p;
+                                       CurEnv->e_to = saveto;
                                        return (NULL);
                                }
 
                                        return (NULL);
                                }
 
@@ -496,6 +501,7 @@ prescan(addr, delim, pvpbuf, delimptr)
                                        usrerr("553 Unbalanced ')'");
                                        if (delimptr != NULL)
                                                *delimptr = p;
                                        usrerr("553 Unbalanced ')'");
                                        if (delimptr != NULL)
                                                *delimptr = p;
+                                       CurEnv->e_to = saveto;
                                        return (NULL);
                                }
                                else
                                        return (NULL);
                                }
                                else
@@ -512,6 +518,7 @@ prescan(addr, delim, pvpbuf, delimptr)
                                        usrerr("553 Unbalanced '>'");
                                        if (delimptr != NULL)
                                                *delimptr = p;
                                        usrerr("553 Unbalanced '>'");
                                        if (delimptr != NULL)
                                                *delimptr = p;
+                                       CurEnv->e_to = saveto;
                                        return (NULL);
                                }
                                anglecnt--;
                                        return (NULL);
                                }
                                anglecnt--;
@@ -565,6 +572,7 @@ prescan(addr, delim, pvpbuf, delimptr)
                                syserr("553 prescan: too many tokens");
                                if (delimptr != NULL)
                                        *delimptr = p;
                                syserr("553 prescan: too many tokens");
                                if (delimptr != NULL)
                                        *delimptr = p;
+                               CurEnv->e_to = saveto;
                                return (NULL);
                        }
                        *avp++ = tok;
                                return (NULL);
                        }
                        *avp++ = tok;
@@ -579,6 +587,7 @@ prescan(addr, delim, pvpbuf, delimptr)
                printf("prescan==>");
                printav(av);
        }
                printf("prescan==>");
                printav(av);
        }
+       CurEnv->e_to = saveto;
        if (av[0] == NULL)
                return (NULL);
        return (av);
        if (av[0] == NULL)
                return (NULL);
        return (av);
index ba5b36a..5deb512 100644 (file)
@@ -10,9 +10,9 @@
 
 #ifndef lint
 #ifdef SMTP
 
 #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
 #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 */
 
 #endif
 #endif /* not lint */
 
@@ -263,6 +263,7 @@ smtp(e)
                        define('r', protocol, e);
                        define('s', sendinghost, e);
                        initsys(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 */
                        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))
                        /* no errors during parsing, but might be a duplicate */
                        e->e_to = p;
                        if (!bitset(QBADADDR, a->q_flags))
+                       {
                                message("250 Recipient ok");
                                message("250 Recipient ok");
+                               nrcpts++;
+                       }
                        else
                        {
                                /* punt -- should keep message in ADDRESS.... */
                        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)
                        collect(TRUE, a != NULL, e);
                        e->e_flags &= ~EF_FATALERRS;
                        if (Errors != 0)
-                               break;
+                               goto abortmessage;
 
                        /*
                        **  Arrange to send to everyone.
 
                        /*
                        **  Arrange to send to everyone.
@@ -470,7 +474,7 @@ smtp(e)
                        */
 
                        SmtpPhase = "delivery";
                        */
 
                        SmtpPhase = "delivery";
-                       if (e->e_nrcpts != 1)
+                       if (nrcpts != 1 && a == NULL)
                        {
                                HoldErrs = TRUE;
                                e->e_errormode = EM_MAIL;
                        {
                                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);
                        /* 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;
                        {
                                /* avoid sending back an extra message */
                                e->e_flags &= ~EF_FATALERRS;
+                               e->e_flags |= EF_CLRQUEUE;
                        }
                        else
                        {
                        }
                        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)
                                {
                                /* 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);
 
                        if (!Verbose && e->e_sendmode != SM_QUEUE)
                                dowork(id, TRUE, e);
 
+  abortmessage:
                        /* if in a child, pop back to our parent */
                        if (InChild)
                                finis();
                        /* if in a child, pop back to our parent */
                        if (InChild)
                                finis();