Apply by doing:
       cd /usr/src
       patch -p0 < 022_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/headers.c
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/headers.c,v
retrieving revision 1.8
retrieving revision 1.8.2.1
diff -u -r1.8 -r1.8.2.1
--- gnu/usr.sbin/sendmail/sendmail/headers.c    14 Jan 2002 03:21:40 -0000      1.8
+++ gnu/usr.sbin/sendmail/sendmail/headers.c    3 Mar 2003 17:16:59 -0000       1.8.2.1
@@ -672,8 +672,8 @@
                       if (buf[0] != '\0')
                       {
                               if (bitset(H_FROM, h->h_flags))
-                                       expand(crackaddr(buf), buf, sizeof buf,
-                                              e);
+                                       expand(crackaddr(buf, e),
+                                              buf, sizeof buf, e);
                               h->h_value = sm_rpool_strdup_x(e->e_rpool, buf);
                               h->h_flags &= ~H_DEFAULT;
                       }
@@ -994,7 +994,11 @@
**     it and replaces it with "$g".  The parse is totally ad hoc
**     and isn't even guaranteed to leave something syntactically
**     identical to what it started with.  However, it does leave
-**     something semantically identical.
+**     something semantically identical if possible, else at least
+**     syntactically correct.
+**
+**     For example, it changes "Real Name <[email protected]> (Comment)"
+**     to "Real Name <$g> (Comment)".
**
**     This algorithm has been cleaned up to handle a wider range
**     of cases -- notably quoted and backslash escaped strings.
@@ -1003,6 +1007,7 @@
**
**     Parameters:
**             addr -- the address to be cracked.
+**             e -- the current envelope.
**
**     Returns:
**             a pointer to the new version.
@@ -1015,28 +1020,50 @@
**             be copied if it is to be reused.
*/

+#define SM_HAVE_ROOM           ((bp < buflim) && (buflim <= bufend))
+
+/*
+**  Append a character to bp if we have room.
+**  If not, punt and return $g.
+*/
+
+#define SM_APPEND_CHAR(c)                                      \
+       do                                                      \
+       {                                                       \
+               if (SM_HAVE_ROOM)                               \
+                       *bp++ = (c);                            \
+               else                                            \
+                       goto returng;                           \
+       } while (0)
+
+#if MAXNAME < 10
+ERROR MAXNAME must be at least 10
+#endif /* MAXNAME < 10 */
+
char *
-crackaddr(addr)
+crackaddr(addr, e)
       register char *addr;
+       ENVELOPE *e;
{
       register char *p;
       register char c;
-       int cmtlev;
-       int realcmtlev;
-       int anglelev, realanglelev;
-       int copylev;
-       int bracklev;
-       bool qmode;
-       bool realqmode;
-       bool skipping;
-       bool putgmac = false;
-       bool quoteit = false;
-       bool gotangle = false;
-       bool gotcolon = false;
+       int cmtlev;                     /* comment level in input string */
+       int realcmtlev;                 /* comment level in output string */
+       int anglelev;                   /* angle level in input string */
+       int copylev;                    /* 0 == in address, >0 copying */
+       int bracklev;                   /* bracket level for IPv6 addr check */
+       bool addangle;                  /* put closing angle in output */
+       bool qmode;                     /* quoting in original string? */
+       bool realqmode;                 /* quoting in output string? */
+       bool putgmac = false;           /* already wrote $g */
+       bool quoteit = false;           /* need to quote next character */
+       bool gotangle = false;          /* found first '<' */
+       bool gotcolon = false;          /* found a ':' */
       register char *bp;
       char *buflim;
       char *bufhead;
       char *addrhead;
+       char *bufend;
       static char buf[MAXNAME + 1];

       if (tTd(33, 1))
@@ -1051,25 +1078,22 @@
       **  adjusted later if we find them.
       */

+       buflim = bufend = &buf[sizeof(buf) - 1];
       bp = bufhead = buf;
-       buflim = &buf[sizeof buf - 7];
       p = addrhead = addr;
-       copylev = anglelev = realanglelev = cmtlev = realcmtlev = 0;
+       copylev = anglelev = cmtlev = realcmtlev = 0;
       bracklev = 0;
-       qmode = realqmode = false;
+       qmode = realqmode = addangle = false;

       while ((c = *p++) != '\0')
       {
               /*
-               **  If the buffer is overful, go into a special "skipping"
-               **  mode that tries to keep legal syntax but doesn't actually
-               **  output things.
+               **  Try to keep legal syntax using spare buffer space
+               **  (maintained by buflim).
               */

-               skipping = bp >= buflim;
-
-               if (copylev > 0 && !skipping)
-                       *bp++ = c;
+               if (copylev > 0)
+                       SM_APPEND_CHAR(c);

               /* check for backslash escapes */
               if (c == '\\')
@@ -1084,8 +1108,8 @@
                               p--;
                               goto putg;
                       }
-                       if (copylev > 0 && !skipping)
-                               *bp++ = c;
+                       if (copylev > 0)
+                               SM_APPEND_CHAR(c);
                       goto putg;
               }

@@ -1093,8 +1117,14 @@
               if (c == '"' && cmtlev <= 0)
               {
                       qmode = !qmode;
-                       if (copylev > 0 && !skipping)
+                       if (copylev > 0 && SM_HAVE_ROOM)
+                       {
+                               if (realqmode)
+                                       buflim--;
+                               else
+                                       buflim++;
                               realqmode = !realqmode;
+                       }
                       continue;
               }
               if (qmode)
@@ -1106,15 +1136,15 @@
                       cmtlev++;

                       /* allow space for closing paren */
-                       if (!skipping)
+                       if (SM_HAVE_ROOM)
                       {
                               buflim--;
                               realcmtlev++;
                               if (copylev++ <= 0)
                               {
                                       if (bp != bufhead)
-                                               *bp++ = ' ';
-                                       *bp++ = c;
+                                               SM_APPEND_CHAR(' ');
+                                       SM_APPEND_CHAR(c);
                               }
                       }
               }
@@ -1124,7 +1154,7 @@
                       {
                               cmtlev--;
                               copylev--;
-                               if (!skipping)
+                               if (SM_HAVE_ROOM)
                               {
                                       realcmtlev--;
                                       buflim++;
@@ -1135,7 +1165,7 @@
               else if (c == ')')
               {
                       /* syntax error: unmatched ) */
-                       if (copylev > 0 && !skipping)
+                       if (copylev > 0 && SM_HAVE_ROOM)
                               bp--;
               }

@@ -1153,7 +1183,7 @@

                       /*
                       **  Check for DECnet phase IV ``::'' (host::user)
-                       **  or **  DECnet phase V ``:.'' syntaxes.  The latter
+                       **  or DECnet phase V ``:.'' syntaxes.  The latter
                       **  covers ``user@DEC:.tay.myhost'' and
                       **  ``DEC:.tay.myhost::user'' syntaxes (bletch).
                       */
@@ -1162,10 +1192,10 @@
                       {
                               if (cmtlev <= 0 && !qmode)
                                       quoteit = true;
-                               if (copylev > 0 && !skipping)
+                               if (copylev > 0)
                               {
-                                       *bp++ = c;
-                                       *bp++ = *p;
+                                       SM_APPEND_CHAR(c);
+                                       SM_APPEND_CHAR(*p);
                               }
                               p++;
                               goto putg;
@@ -1176,41 +1206,43 @@
                       bp = bufhead;
                       if (quoteit)
                       {
-                               *bp++ = '"';
+                               SM_APPEND_CHAR('"');

                               /* back up over the ':' and any spaces */
                               --p;
-                               while (isascii(*--p) && isspace(*p))
+                               while (p > addr &&
+                                      isascii(*--p) && isspace(*p))
                                       continue;
                               p++;
                       }
                       for (q = addrhead; q < p; )
                       {
                               c = *q++;
-                               if (bp < buflim)
+                               if (quoteit && c == '"')
                               {
-                                       if (quoteit && c == '"')
-                                               *bp++ = '\\';
-                                       *bp++ = c;
+                                       SM_APPEND_CHAR('\\');
+                                       SM_APPEND_CHAR(c);
                               }
+                               else
+                                       SM_APPEND_CHAR(c);
                       }
                       if (quoteit)
                       {
                               if (bp == &bufhead[1])
                                       bp--;
                               else
-                                       *bp++ = '"';
+                                       SM_APPEND_CHAR('"');
                               while ((c = *p++) != ':')
-                               {
-                                       if (bp < buflim)
-                                               *bp++ = c;
-                               }
-                               *bp++ = c;
+                                       SM_APPEND_CHAR(c);
+                               SM_APPEND_CHAR(c);
                       }

                       /* any trailing white space is part of group: */
-                       while (isascii(*p) && isspace(*p) && bp < buflim)
-                               *bp++ = *p++;
+                       while (isascii(*p) && isspace(*p))
+                       {
+                               SM_APPEND_CHAR(*p);
+                               p++;
+                       }
                       copylev = 0;
                       putgmac = quoteit = false;
                       bufhead = bp;
@@ -1219,10 +1251,7 @@
               }

               if (c == ';' && copylev <= 0 && !ColonOkInAddr)
-               {
-                       if (bp < buflim)
-                               *bp++ = c;
-               }
+                       SM_APPEND_CHAR(c);

               /* check for characters that may have to be quoted */
               if (strchr(MustQuoteChars, c) != NULL)
@@ -1250,42 +1279,45 @@

                       /* oops -- have to change our mind */
                       anglelev = 1;
-                       if (!skipping)
-                               realanglelev = 1;
+                       if (SM_HAVE_ROOM)
+                       {
+                               if (!addangle)
+                                       buflim--;
+                               addangle = true;
+                       }

                       bp = bufhead;
                       if (quoteit)
                       {
-                               *bp++ = '"';
+                               SM_APPEND_CHAR('"');

                               /* back up over the '<' and any spaces */
                               --p;
-                               while (isascii(*--p) && isspace(*p))
+                               while (p > addr &&
+                                      isascii(*--p) && isspace(*p))
                                       continue;
                               p++;
                       }
                       for (q = addrhead; q < p; )
                       {
                               c = *q++;
-                               if (bp < buflim)
+                               if (quoteit && c == '"')
                               {
-                                       if (quoteit && c == '"')
-                                               *bp++ = '\\';
-                                       *bp++ = c;
+                                       SM_APPEND_CHAR('\\');
+                                       SM_APPEND_CHAR(c);
                               }
+                               else
+                                       SM_APPEND_CHAR(c);
                       }
                       if (quoteit)
                       {
                               if (bp == &buf[1])
                                       bp--;
                               else
-                                       *bp++ = '"';
+                                       SM_APPEND_CHAR('"');
                               while ((c = *p++) != '<')
-                               {
-                                       if (bp < buflim)
-                                               *bp++ = c;
-                               }
-                               *bp++ = c;
+                                       SM_APPEND_CHAR(c);
+                               SM_APPEND_CHAR(c);
                       }
                       copylev = 0;
                       putgmac = quoteit = false;
@@ -1297,13 +1329,14 @@
                       if (anglelev > 0)
                       {
                               anglelev--;
-                               if (!skipping)
+                               if (SM_HAVE_ROOM)
                               {
-                                       realanglelev--;
-                                       buflim++;
+                                       if (addangle)
+                                               buflim++;
+                                       addangle = false;
                               }
                       }
-                       else if (!skipping)
+                       else if (SM_HAVE_ROOM)
                       {
                               /* syntax error: unmatched > */
                               if (copylev > 0)
@@ -1312,7 +1345,7 @@
                               continue;
                       }
                       if (copylev++ <= 0)
-                               *bp++ = c;
+                               SM_APPEND_CHAR(c);
                       continue;
               }

@@ -1320,30 +1353,42 @@
       putg:
               if (copylev <= 0 && !putgmac)
               {
-                       if (bp > bufhead && bp[-1] == ')')
-                               *bp++ = ' ';
-                       *bp++ = MACROEXPAND;
-                       *bp++ = 'g';
+                       if (bp > buf && bp[-1] == ')')
+                               SM_APPEND_CHAR(' ');
+                       SM_APPEND_CHAR(MACROEXPAND);
+                       SM_APPEND_CHAR('g');
                       putgmac = true;
               }
       }

       /* repair any syntactic damage */
-       if (realqmode)
+       if (realqmode && bp < bufend)
               *bp++ = '"';
-       while (realcmtlev-- > 0)
+       while (realcmtlev-- > 0 && bp < bufend)
               *bp++ = ')';
-       while (realanglelev-- > 0)
+       if (addangle && bp < bufend)
               *bp++ = '>';
-       *bp++ = '\0';
+       *bp = '\0';
+       if (bp < bufend)
+               goto success;
+
+ returng:
+       /* String too long, punt */
+       buf[0] = '<';
+       buf[1] = MACROEXPAND;
+       buf[2]= 'g';
+       buf[3] = '>';
+       buf[4]= '\0';
+       sm_syslog(LOG_ALERT, e->e_id,
+                 "Dropped invalid comments from header address");

+ success:
       if (tTd(33, 1))
       {
               sm_dprintf("crackaddr=>`");
               xputs(buf);
               sm_dprintf("'\n");
       }
-
       return buf;
}
/*
Index: gnu/usr.sbin/sendmail/sendmail/main.c
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/main.c,v
retrieving revision 1.11
retrieving revision 1.11.2.1
diff -u -r1.11 -r1.11.2.1
--- gnu/usr.sbin/sendmail/sendmail/main.c       14 Jan 2002 03:21:40 -0000      1.11
+++ gnu/usr.sbin/sendmail/sendmail/main.c       3 Mar 2003 17:16:59 -0000       1.11.2.1
@@ -4204,7 +4204,7 @@
                                                    "Usage: /parse address\n");
                               return;
                       }
-                       q = crackaddr(p);
+                       q = crackaddr(p, e);
                       (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
                                            "Cracked address = ");
                       xputs(q);
Index: gnu/usr.sbin/sendmail/sendmail/parseaddr.c
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/parseaddr.c,v
retrieving revision 1.10
retrieving revision 1.10.2.1
diff -u -r1.10 -r1.10.2.1
--- gnu/usr.sbin/sendmail/sendmail/parseaddr.c  14 Jan 2002 03:21:40 -0000      1.10
+++ gnu/usr.sbin/sendmail/sendmail/parseaddr.c  3 Mar 2003 17:16:59 -0000       1.10.2.1
@@ -2448,7 +2448,7 @@
       if (bitset(RF_CANONICAL, flags) || bitnset(M_NOCOMMENT, m->m_flags))
               fancy = "\201g";
       else
-               fancy = crackaddr(name);
+               fancy = crackaddr(name, e);

       /*
       **  Turn the name into canonical form.
Index: gnu/usr.sbin/sendmail/sendmail/sendmail.h
===================================================================
RCS file: /cvs/src/gnu/usr.sbin/sendmail/sendmail/sendmail.h,v
retrieving revision 1.11
retrieving revision 1.11.2.1
diff -u -r1.11 -r1.11.2.1
--- gnu/usr.sbin/sendmail/sendmail/sendmail.h   14 Jan 2002 03:21:40 -0000      1.11
+++ gnu/usr.sbin/sendmail/sendmail/sendmail.h   3 Mar 2003 17:16:59 -0000       1.11.2.1
@@ -316,7 +316,7 @@

/* functions */
extern void    cataddr __P((char **, char **, char *, int, int));
-extern char    *crackaddr __P((char *));
+extern char    *crackaddr __P((char *, ENVELOPE *));
extern bool    emptyaddr __P((ADDRESS *));
extern ADDRESS *getctladdr __P((ADDRESS *));
extern int     include __P((char *, bool, ADDRESS *, ADDRESS **, int, ENVELOPE *));