Blob Blame History Raw
Index: bogofilter/AUTHORS
===================================================================
--- bogofilter/AUTHORS	(revision 7015)
+++ bogofilter/AUTHORS	(revision 7016)
@@ -55,3 +55,4 @@
 Marco Bozzolan
 Paul Mangan
 Roman Trunov
+Julius Plenz
Index: bogofilter/src/tests/inputs/t.passthrough-truncation-in.gz
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: bogofilter/src/tests/inputs/t.passthrough-truncation-in.gz
===================================================================
--- bogofilter/src/tests/inputs/t.passthrough-truncation-in.gz	(nonexistent)
+++ bogofilter/src/tests/inputs/t.passthrough-truncation-in.gz	(revision 7016)

Property changes on: bogofilter/src/tests/inputs/t.passthrough-truncation-in.gz
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: bogofilter/src/tests/t.passthrough-truncation
===================================================================
--- bogofilter/src/tests/t.passthrough-truncation	(nonexistent)
+++ bogofilter/src/tests/t.passthrough-truncation	(revision 7016)
@@ -0,0 +1,19 @@
+#! /bin/sh
+
+. ${srcdir:=.}/t.frame
+
+# t.passthrough-hb
+#
+#	test for correct passthrough of misdeclared MIME parts
+#	test case provided by Julius Plenz, July 2014.
+
+gzip -c -d <"$srcdir/inputs/t.passthrough-truncation-in.gz" >"$TMPDIR/input"
+$BOGOFILTER -e -p -C < "$TMPDIR/input" \
+| $GREP -v "^X-Bogosity: Unsure," > "$TMPDIR/output"
+
+if  [ $verbose -eq 0 ]; then
+    cmp "$TMPDIR/input" "$TMPDIR/output"
+else
+    set +e
+    diff $DIFF_BRIEF "$TMPDIR/input" "$TMPDIR/output"
+fi

Property changes on: bogofilter/src/tests/t.passthrough-truncation
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: bogofilter/src/tests/Makefile.am
===================================================================
--- bogofilter/src/tests/Makefile.am	(revision 7015)
+++ bogofilter/src/tests/Makefile.am	(revision 7016)
@@ -35,7 +35,7 @@
 	t.ignore_spam_header \
 	t.nullstatsprefix \
 	t.integrity t.integrity2 t.integrity3 \
-	t.passthrough-hb \
+	t.passthrough-hb t.passthrough-truncation \
 	t.escaped.html t.escaped.url \
 	t.base64 t.split t.parsing \
 	t.lexer t.lexer.mbx t.lexer.qpcr t.lexer.eoh \
@@ -97,6 +97,7 @@
 	inputs/msg.split.dr.0118.base64 \
 	inputs/msg.split.gs.0119.text \
 	inputs/spam.mbx \
+	inputs/t.passthrough-truncation-in.gz \
 	outputs/MH.out \
 	outputs/bogolex.out \
 	outputs/bulkmode.out \
Index: bogofilter/src/lexer.c
===================================================================
--- bogofilter/src/lexer.c	(revision 7015)
+++ bogofilter/src/lexer.c	(revision 7016)
@@ -220,15 +220,25 @@
 
 #ifndef	DISABLE_UNICODE
     if (encoding == E_UNICODE &&
-	!msg_state->mime_dont_decode)
+	!msg_state->mime_dont_decode &&
+        count > 0)
     {
 	iconvert(linebuff, buff);
+
+	/* If we return count = 0 here, the caller will think we have
+	 * no more bytes left to read, even though before the iconvert
+	 * call we had a positive number of bytes. This *will* lead to
+	 * a message truncation which we try to avoid by simply
+	 * returning the original input buffer (which has positive
+	 * length) instead. */
+	if(buff->t.leng == 0)
+	    memcpy(buff, linebuff, sizeof(*buff));
+
 	/*
 	 * iconvert, treating multi-byte sequences, can shrink or enlarge
 	 * the output compared to its input.  Correct count.
 	 */
-	if (count > 0)
-	    count = buff->t.leng;
+	count = buff->t.leng;
     }
 #endif
 
Index: bogofilter/NEWS
===================================================================
--- bogofilter/NEWS	(revision 7015)
+++ bogofilter/NEWS	(revision 7016)
@@ -15,6 +15,13 @@
 
 -------------------------------------------------------------------------------
 
+	2014-07-10
+
+	* Take patch from Julius Plenz to fix a bug in the charset converter
+	  that causes truncation of messages in pass-through mode in rare
+	  circumstances, for instance, if binary data is misdeclared as
+	  text/html.  Also add his test case, t.passthrough-truncation.
+
 	2013-11-30
 
 	* Updated autoconf/automake stuff so that tests work properly with