fixes for problems causing mail to be both sent and rejected
[unix-history] / usr / src / usr.sbin / sendmail / src / parseaddr.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);