don't pass through NOTIFY= unless it was given in the SMTP RCPT
[unix-history] / usr / src / usr.sbin / sendmail / src / parseaddr.c
index 89ec0a2..0315056 100644 (file)
@@ -7,11 +7,13 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)parseaddr.c        8.51 (Berkeley) %G%";
+static char sccsid[] = "@(#)parseaddr.c        8.60 (Berkeley) %G%";
 #endif /* not lint */
 
 #include "sendmail.h"
 
 #endif /* not lint */
 
 #include "sendmail.h"
 
+static int     callsubr __P((char **, int, ENVELOPE *));
+
 #ifdef CC_WONT_PROMOTE
 static int toktype __P((char));
 #else  /* !CC_WONT_PROMOTE */
 #ifdef CC_WONT_PROMOTE
 static int toktype __P((char));
 #else  /* !CC_WONT_PROMOTE */
@@ -209,7 +211,7 @@ invalidaddr(addr, delimptr)
        register char *addr;
        char *delimptr;
 {
        register char *addr;
        char *delimptr;
 {
-       char savedelim;
+       char savedelim = '\0';
 
        if (delimptr != NULL)
        {
 
        if (delimptr != NULL)
        {
@@ -232,14 +234,14 @@ invalidaddr(addr, delimptr)
        }
        if (*addr == '\0')
        {
        }
        if (*addr == '\0')
        {
-               if (savedelim != '\0' && delimptr != NULL)
+               if (delimptr != NULL && savedelim != '\0')
                        *delimptr = savedelim;
                return FALSE;
        }
        setstat(EX_USAGE);
        usrerr("553 Address contained invalid control characters");
   addrfailure:
                        *delimptr = savedelim;
                return FALSE;
        }
        setstat(EX_USAGE);
        usrerr("553 Address contained invalid control characters");
   addrfailure:
-       if (savedelim != '\0' && delimptr != NULL)
+       if (delimptr != NULL && savedelim != '\0')
                *delimptr = savedelim;
        return TRUE;
 }
                *delimptr = savedelim;
        return TRUE;
 }
@@ -435,7 +437,7 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr)
                char obuf[50];
 
                firsttime = FALSE;
                char obuf[50];
 
                firsttime = FALSE;
-               expand("\201o", obuf, &obuf[sizeof obuf - sizeof DELIMCHARS], CurEnv);
+               expand("\201o", obuf, sizeof obuf - sizeof DELIMCHARS, CurEnv);
                strcat(obuf, DELIMCHARS);
                for (p = obuf; *p != '\0'; p++)
                {
                strcat(obuf, DELIMCHARS);
                for (p = obuf; *p != '\0'; p++)
                {
@@ -476,6 +478,8 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr)
                                if (q >= &pvpbuf[pvpbsize - 5])
                                {
                                        usrerr("553 Address too long");
                                if (q >= &pvpbuf[pvpbsize - 5])
                                {
                                        usrerr("553 Address too long");
+                                       if (strlen(addr) > MAXNAME)
+                                               addr[MAXNAME] = '\0';
        returnnull:
                                        if (delimptr != NULL)
                                                *delimptr = p;
        returnnull:
                                        if (delimptr != NULL)
                                                *delimptr = p;
@@ -1431,11 +1435,6 @@ backup:
                **  Then copy vector back into original space.
                */
 
                **  Then copy vector back into original space.
                */
 
-               callsubr(npvp);
-
-               for (avp = npvp; *avp++ != NULL;);
-                       subr = atoi(*++rvp);
-                       rvp++;
 
                else
                        subr = -1;
 
                else
                        subr = -1;
@@ -1493,6 +1492,70 @@ backup:
 **             pvp is modified.
 */
 
 **             pvp is modified.
 */
 
+static int
+callsubr(pvp, reclevel, e)
+       char **pvp;
+       int reclevel;
+       ENVELOPE *e;
+{
+       char **rvp;
+       int subr;
+       int stat;
+       STAB *s;
+
+       for (; *pvp != NULL; pvp++)
+       {
+               if ((**pvp & 0377) == CALLSUBR && pvp[1] != NULL)
+                       break;
+       }
+       if (*pvp == NULL)
+               return EX_OK;
+
+       if (tTd(21, 3))
+               printf("-----callsubr %s\n", pvp[1]);
+
+       s = stab(pvp[1], ST_RULESET, ST_FIND);
+       if (s == NULL)
+               subr = atoi(pvp[1]);
+       else
+               subr = s->s_ruleset;
+
+       /*
+       **  Take care of possible inner calls.
+       */
+
+       stat = callsubr(&pvp[2], reclevel, e);
+       if (stat != EX_OK)
+               return stat;
+
+       /*
+       **  Move vector up over calling opcode.
+       */
+
+       for (rvp = &pvp[2]; *rvp != NULL; rvp++)
+               rvp[-2] = rvp[0];
+       rvp[-2] = NULL;
+
+       /*
+       **  Call inferior ruleset.
+       */
+
+       stat = rewrite(pvp, subr, reclevel, e);
+       return stat;
+}
+\f/*
+**  CALLSUBR -- call subroutines in rewrite vector
+**
+**     Parameters:
+**             pvp -- pointer to token vector.
+**
+**     Returns:
+**             none.
+**
+**     Side Effects:
+**             pvp is modified.
+*/
+
 static void
 callsubr(pvp)
        char **pvp;
 static void
 callsubr(pvp)
        char **pvp;
@@ -1579,7 +1642,7 @@ buildaddr(tv, a, flags, e)
        int spaceleft;
        static MAILER errormailer;
        static char *errorargv[] = { "ERROR", NULL };
        int spaceleft;
        static MAILER errormailer;
        static char *errorargv[] = { "ERROR", NULL };
-       static char buf[MAXNAME];
+       static char buf[MAXNAME + 1];
 
        if (tTd(24, 5))
        {
 
        if (tTd(24, 5))
        {
@@ -1919,12 +1982,12 @@ struct qflags   AddressFlags[] =
        "QPINGONSUCCESS",       QPINGONSUCCESS,
        "QPINGONFAILURE",       QPINGONFAILURE,
        "QPINGONDELAY",         QPINGONDELAY,
        "QPINGONSUCCESS",       QPINGONSUCCESS,
        "QPINGONFAILURE",       QPINGONFAILURE,
        "QPINGONDELAY",         QPINGONDELAY,
-       "QHAS_RET_PARAM",       QHAS_RET_PARAM,
-       "QRET_HDRS",            QRET_HDRS,
+       "QHASNOTIFY",           QHASNOTIFY,
        "QRELAYED",             QRELAYED,
        NULL
 };
 
        "QRELAYED",             QRELAYED,
        NULL
 };
 
+void
 void
 printaddr(a, follow)
        register ADDRESS *a;
 void
 printaddr(a, follow)
        register ADDRESS *a;
@@ -2029,8 +2092,8 @@ remotename(name, m, flags, pstat, e)
        char *fancy;
        char *oldg = macvalue('g', e);
        int rwset;
        char *fancy;
        char *oldg = macvalue('g', e);
        int rwset;
-       static char buf[MAXNAME];
-       char lbuf[MAXNAME];
+       static char buf[MAXNAME + 1];
+       char lbuf[MAXNAME + 1];
        char pvpbuf[PSBUFSIZE];
 
        if (tTd(12, 1))
        char pvpbuf[PSBUFSIZE];
 
        if (tTd(12, 1))
@@ -2118,9 +2181,9 @@ remotename(name, m, flags, pstat, e)
 
        /* need to make sure route-addrs have <angle brackets> */
        if (bitset(RF_CANONICAL, flags) && lbuf[0] == '@')
 
        /* need to make sure route-addrs have <angle brackets> */
        if (bitset(RF_CANONICAL, flags) && lbuf[0] == '@')
-               expand("<\201g>", buf, &buf[sizeof buf - 1], e);
+               expand("<\201g>", buf, sizeof buf, e);
        else
        else
-               expand(fancy, buf, &buf[sizeof buf - 1], e);
+               expand(fancy, buf, sizeof buf, e);
 
        define('g', oldg, e);
 
 
        define('g', oldg, e);