Adrian Reber 80a818
Index: bogofilter/src/mime.c
Adrian Reber 80a818
===================================================================
Adrian Reber 80a818
--- bogofilter/src/mime.c	(revision 7022)
Adrian Reber 80a818
+++ bogofilter/src/mime.c	(revision 7023)
Adrian Reber 80a818
@@ -279,6 +279,25 @@
Adrian Reber 80a818
     mime_push(parent);
Adrian Reber 80a818
 }
Adrian Reber 80a818
 
Adrian Reber 80a818
+static bool is_final_boundary(
Adrian Reber 80a818
+	const byte	*ins,
Adrian Reber 80a818
+	size_t		 inlen,
Adrian Reber 80a818
+	size_t		 blen
Adrian Reber 80a818
+)
Adrian Reber 80a818
+{
Adrian Reber 80a818
+    if (inlen >= 5
Adrian Reber 80a818
+	    && inlen >= blen + 2
Adrian Reber 80a818
+	    && ins[0] == '-'
Adrian Reber 80a818
+	    && ins[1] == '-'
Adrian Reber 80a818
+	    && ins[blen+2] == '-'
Adrian Reber 80a818
+	    && ins[blen+3] == '-')
Adrian Reber 80a818
+    {
Adrian Reber 80a818
+	return true;
Adrian Reber 80a818
+    }
Adrian Reber 80a818
+    return false;
Adrian Reber 80a818
+}
Adrian Reber 80a818
+
Adrian Reber 80a818
+
Adrian Reber 80a818
 /**
Adrian Reber 80a818
  * Check if the line given in \a boundary is a boundary of one of the
Adrian Reber 80a818
  * outer MIME containers and store the results in \a b.
Adrian Reber 80a818
@@ -301,28 +320,18 @@
Adrian Reber 80a818
 	       (buf[blen - 1] == '\r' || buf[blen - 1] == '\n'))
Adrian Reber 80a818
 	    blen--;
Adrian Reber 80a818
 
Adrian Reber 80a818
-	/* skip initial -- */
Adrian Reber 80a818
-	buf += 2;
Adrian Reber 80a818
-	blen -= 2;
Adrian Reber 80a818
-
Adrian Reber 80a818
-	/* skip and note ending --, if any */
Adrian Reber 80a818
-	if (blen > 2 && buf[blen - 1] == '-' && buf[blen - 2] == '-') {
Adrian Reber 80a818
-	    b->is_final = true;
Adrian Reber 80a818
-	    blen -= 2;
Adrian Reber 80a818
-	} else {
Adrian Reber 80a818
-	    b->is_final = false;
Adrian Reber 80a818
-	}
Adrian Reber 80a818
-
Adrian Reber 80a818
 	/* search stack for matching boundary, in reverse order */
Adrian Reber 80a818
 	for (ptr = mime_stack_bot; ptr != NULL; ptr = ptr->parent)
Adrian Reber 80a818
 	{
Adrian Reber 80a818
 	    if (is_mime_container(ptr)
Adrian Reber 80a818
 		&& ptr->boundary != NULL
Adrian Reber 80a818
-		&& ptr->boundary_len == blen
Adrian Reber 80a818
-		&& (memcmp(ptr->boundary, buf, blen) == 0))
Adrian Reber 80a818
+		&& (ptr->boundary_len + 2 == blen
Adrian Reber 80a818
+		    || ptr->boundary_len + 4 == blen)
Adrian Reber 80a818
+		&& (memcmp(ptr->boundary, buf + 2, ptr->boundary_len) == 0))
Adrian Reber 80a818
 	    {
Adrian Reber 80a818
 		b->depth = ptr->depth;
Adrian Reber 80a818
 		b->is_valid = true;
Adrian Reber 80a818
+		b->is_final = is_final_boundary(buf, blen, ptr->boundary_len);
Adrian Reber 80a818
 		break;
Adrian Reber 80a818
 	    }
Adrian Reber 80a818
 	}
Adrian Reber 80a818
Index: bogofilter/NEWS
Adrian Reber 80a818
===================================================================
Adrian Reber 80a818
--- bogofilter/NEWS	(revision 7022)
Adrian Reber 80a818
+++ bogofilter/NEWS	(revision 7023)
Adrian Reber 80a818
@@ -15,6 +15,15 @@
Adrian Reber 80a818
 
Adrian Reber 80a818
 -------------------------------------------------------------------------------
Adrian Reber 80a818
 
Adrian Reber 80a818
+	2015-02-25
Adrian Reber 80a818
+
Adrian Reber 80a818
+	* Fix the lexer to handle MIME multipart messages properly when the
Adrian Reber 80a818
+	  boundary ended in "--".  The parser would previously never find the
Adrian Reber 80a818
+	  MIME parts because it mistook all boundaries ending in two dashes to
Adrian Reber 80a818
+	  be the final boundary of the multipart, rather than checking if the
Adrian Reber 80a818
+	  two dashes were extra.
Adrian Reber 80a818
+	  Reported by Matt Garretson to the bogofilter mailing list today.
Adrian Reber 80a818
+
Adrian Reber 80a818
 	2014-07-10
Adrian Reber 80a818
 
Adrian Reber 80a818
 	* Take patch from Julius Plenz to fix a bug in the charset converter