NOTE: this is the second revision of the patch

Apply by doing:
       cd /usr/src
       patch -p0 < 005_sendmail.patch

And then rebuild and install sendmail:
       cd gnu/usr.sbin/sendmail
       make depend
       make
       make install

Restart sendmail if necessary:
       kill -HUP `sed q /var/run/sendmail.pid`

Index: gnu/usr.sbin/sendmail/sendmail/parseaddr.c
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/parseaddr.c,v
retrieving revision 1.16
diff -u -r1.16 parseaddr.c
--- gnu/usr.sbin/sendmail/sendmail/parseaddr.c  29 Mar 2003 19:44:01 -0000      1.16
+++ gnu/usr.sbin/sendmail/sendmail/parseaddr.c  17 Sep 2003 17:14:50 -0000
@@ -700,7 +700,11 @@
                                               addr[MAXNAME] = '\0';
       returnnull:
                                       if (delimptr != NULL)
+                                       {
+                                               if (p > addr)
+                                                       p--;
                                               *delimptr = p;
+                                       }
                                       CurEnv->e_to = saveto;
                                       return NULL;
                               }
@@ -1000,6 +1004,8 @@
       }
       if (pvp == NULL)
               return EX_USAGE;
+       if (maxatom <= 0)
+               return EX_USAGE;

       /*
       **  Run through the list of rewrite rules, applying
@@ -1866,6 +1872,7 @@
       register ENVELOPE *e;
{
       bool tempfail = false;
+       int maxatom;
       struct mailer **mp;
       register struct mailer *m;
       register char *p;
@@ -1880,6 +1887,7 @@
               printav(tv);
       }

+       maxatom = MAXATOM;
       if (a == NULL)
               a = (ADDRESS *) sm_rpool_malloc_x(e->e_rpool, sizeof *a);
       memset((char *) a, '\0', sizeof *a);
@@ -1919,14 +1927,22 @@
               return a;
       }
       mname = *++tv;
+       --maxatom;

       /* extract host and user portions */
       if (*++tv != NULL && (**tv & 0377) == CANONHOST)
+       {
               hostp = ++tv;
+               --maxatom;
+       }
       else
               hostp = NULL;
+       --maxatom;
       while (*tv != NULL && (**tv & 0377) != CANONUSER)
+       {
               tv++;
+               --maxatom;
+       }
       if (*tv == NULL)
       {
               syserr("554 5.3.5 buildaddr: no user");
@@ -1937,6 +1953,7 @@
       else if (hostp != NULL)
               cataddr(hostp, tv - 1, hbuf, sizeof hbuf, '\0');
       cataddr(++tv, NULL, ubuf, sizeof ubuf, ' ');
+       --maxatom;

       /* save away the host name */
       if (sm_strcasecmp(mname, "error") == 0)
@@ -2041,6 +2058,7 @@
       {
               p++;
               tv++;
+               --maxatom;
               a->q_flags |= QNOTREMOTE;
       }

@@ -2071,11 +2089,11 @@
           !bitset(RF_SENDERADDR|RF_HEADERADDR, flags))
       {
               /* sender addresses done later */
-               (void) REWRITE(tv, 2, e);
+               (void) rewrite(tv, 2, 0, e, maxatom);
               if (m->m_re_rwset > 0)
-                      (void) REWRITE(tv, m->m_re_rwset, e);
+                      (void) rewrite(tv, m->m_re_rwset, 0, e, maxatom);
       }
-       (void) REWRITE(tv, 4, e);
+       (void) rewrite(tv, 4, 0, e, maxatom);

       /* save the result for the command line/RCPT argument */
       cataddr(tv, NULL, ubuf, sizeof ubuf, '\0');