fixes for problems causing mail to be both sent and rejected
[unix-history] / usr / src / usr.sbin / sendmail / src / parseaddr.c
index 7f265cd..8d11206 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)parseaddr.c        6.48 (Berkeley) %G%";
+static char sccsid[] = "@(#)parseaddr.c        6.50 (Berkeley) %G%";
 #endif /* not lint */
 
 #include "sendmail.h"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -167,9 +167,13 @@ parseaddr(addr, a, copyf, delim, delimptr, e)
 
        if (queueup)
        {
 
        if (queueup)
        {
+               char *msg = "Transient parse error -- message queued for future delivery";
+
                if (tTd(20, 1))
                        printf("parseaddr: queuing message\n");
                if (tTd(20, 1))
                        printf("parseaddr: queuing message\n");
-               message("Transient parse error -- message queued for future delivery");
+               message(msg);
+               if (e->e_message == NULL)
+                       e->e_message = msg;
                a->q_flags |= QQUEUEUP;
        }
 
                a->q_flags |= QQUEUEUP;
        }
 
@@ -243,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;
@@ -379,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 */
@@ -392,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: ");
@@ -414,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);
                                }
 
@@ -492,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
@@ -508,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--;
@@ -561,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;
@@ -575,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);