Package: sendmail
Version: 8.13.4-3sarge1
Followup-For: Bug #373801
This is a patch based on sendmail-8.13.1-VU#146718.patch from redhat
-- System Information:
Debian Release: 3.1
Architecture: i386 (i686)
Kernel: Linux 2.4.30-acens-sata
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
diff -u -p -Nr --exclude CVS sendmail-8.13.4.orig/sendmail/deliver.c sendmail-8.13.4/sendmail/deliver.c
--- sendmail-8.13.4.orig/sendmail/deliver.c 2005-03-05 03:28:50.000000000 +0100
+++ sendmail-8.13.4/sendmail/deliver.c 2006-07-12 20:41:45.000000000 +0200
@@ -4592,7 +4592,7 @@ putbody(mci, e, separator)
/* now do the hard work */
boundaries[0] = NULL;
mci->mci_flags |= MCIF_INHEADER;
- (void) mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER);
+ (void) mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER, 0);
}
# if MIME7TO8
else if (bitset(MCIF_CVT7TO8, mci->mci_flags))
@@ -4620,7 +4620,7 @@ putbody(mci, e, separator)
SuprErrs = true;
(void) mime8to7(mci, e->e_header, e, boundaries,
- M87F_OUTER|M87F_NO8TO7);
+ M87F_OUTER|M87F_NO8TO7, 0);
/* restore SuprErrs */
SuprErrs = oldsuprerrs;
diff -u -p -Nr --exclude CVS sendmail-8.13.4.orig/sendmail/mime.c sendmail-8.13.4/sendmail/mime.c
--- sendmail-8.13.4.orig/sendmail/mime.c 2004-09-02 23:37:26.000000000 +0200
+++ sendmail-8.13.4/sendmail/mime.c 2006-07-12 20:44:58.000000000 +0200
@@ -80,6 +80,7 @@ static bool MapNLtoCRLF;
** boundaries -- the currently pending message boundaries.
** NULL if we are processing the outer portion.
** flags -- to tweak processing.
+** level -- recursion level.
**
** Returns:
** An indicator of what terminated the message part:
@@ -95,12 +96,13 @@ struct args
};
int
-mime8to7(mci, header, e, boundaries, flags)
+mime8to7(mci, header, e, boundaries, flags, level)
register MCI *mci;
HDR *header;
register ENVELOPE *e;
char **boundaries;
int flags;
+ int level;
{
register char *p;
int linelen;
@@ -121,6 +123,18 @@ mime8to7(mci, header, e, boundaries, fla
char pvpbuf[MAXLINE];
extern unsigned char MimeTokenTab[256];
+ if (level > MAXMIMENESTING)
+ {
+ if (!bitset(EF_TOODEEP, e->e_flags))
+ {
+ if (tTd(43, 4))
+ sm_dprintf("mime8to7: too deep, level=%d\n",
+ level);
+ usrerr("mime8to7: recursion level %d exceeded",
+ level);
+ e->e_flags |= EF_DONT_MIME|EF_TOODEEP;
+ }
+ }
if (tTd(43, 1))
{
sm_dprintf("mime8to7: flags = %x, boundaries =", flags);
@@ -241,7 +255,9 @@ mime8to7(mci, header, e, boundaries, fla
*/
if (sm_strcasecmp(type, "multipart") == 0 &&
- (!bitset(M87F_NO8BIT, flags) || bitset(M87F_NO8TO7, flags)))
+ (!bitset(M87F_NO8BIT, flags) || bitset(M87F_NO8TO7, flags)) &&
+ !bitset(EF_TOODEEP, e->e_flags)
+ )
{
if (sm_strcasecmp(subtype, "digest") == 0)
@@ -285,10 +301,13 @@ mime8to7(mci, header, e, boundaries, fla
}
if (i >= MAXMIMENESTING)
{
- usrerr("mime8to7: multipart nesting boundary too deep");
+ if (tTd(43, 4))
+ sm_dprintf("mime8to7: too deep, i=%d\n", i);
+ if (!bitset(EF_TOODEEP, e->e_flags))
+ usrerr("mime8to7: multipart nesting boundary too deep");
/* avoid bounce loops */
- e->e_flags |= EF_DONT_MIME;
+ e->e_flags |= EF_DONT_MIME|EF_TOODEEP;
}
else
{
@@ -328,7 +347,9 @@ mime8to7(mci, header, e, boundaries, fla
putheader(mci, hdr, e, flags);
if (tTd(43, 101))
putline("+++after putheader", mci);
- bt = mime8to7(mci, hdr, e, boundaries, flags);
+ bt = mime8to7(mci, hdr, e, boundaries, flags,
+ level + 1);
+
}
(void) sm_strlcpyn(buf, sizeof buf, 3, "--", bbuf, "--");
putline(buf, mci);
@@ -365,7 +386,8 @@ mime8to7(mci, header, e, boundaries, fla
if (sm_strcasecmp(type, "message") == 0)
{
- if (!wordinclass(subtype, 's'))
+ if (!wordinclass(subtype, 's') ||
+ bitset(EF_TOODEEP, e->e_flags))
{
flags |= M87F_NO8BIT;
}
@@ -385,7 +407,9 @@ mime8to7(mci, header, e, boundaries, fla
if (hvalue("MIME-Version", hdr) == NULL &&
!bitset(M87F_NO8TO7, flags))
putline("MIME-Version: 1.0", mci);
- bt = mime8to7(mci, hdr, e, boundaries, flags);
+ bt = mime8to7(mci, hdr, e, boundaries, flags,
+ level + 1);
+
mci->mci_flags &= ~MCIF_INMIME;
return bt;
}
diff -u -p -Nr --exclude CVS sendmail-8.13.4.orig/sendmail/sendmail.h sendmail-8.13.4/sendmail/sendmail.h
--- sendmail-8.13.4.orig/sendmail/sendmail.h 2005-03-07 19:03:17.000000000 +0100
+++ sendmail-8.13.4/sendmail/sendmail.h 2006-07-12 20:43:41.000000000 +0200
@@ -942,6 +942,7 @@ struct envelope
#define EF_TOOBIG 0x02000000L /* message is too big */
#define EF_SPLIT 0x04000000L /* envelope has been split */
#define EF_UNSAFE 0x08000000L /* unsafe: read from untrusted source */
+#define EF_TOODEEP 0x10000000L /* message is nested too deep */
#define DLVR_NOTIFY 0x01
#define DLVR_RETURN 0x02
@@ -1651,7 +1652,7 @@ EXTERN unsigned long PrivacyFlags; /* pr
/* functions */
extern void mime7to8 __P((MCI *, HDR *, ENVELOPE *));
-extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int));
+extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int, int));
/*
** Flags passed to returntosender.