+2008-08-13 Eric Gillespie <epg@pretzelnet.org>
+
+ * test/tests/bad-input/test-header: Add test for it.
+
+ * sbr/m_getfld.c: If we reach the end of the line without finding
+ a ':' when parsing a header field, treat that line as the
+ beginning of the body rather than blowing up. These messages are
+ usually spam, but it's nice to be able to at least scan them.
+
2008-08-12 Eric Gillespie <epg@pretzelnet.org>
* test/tests/mhshow/test-qp: Test various valid and invalid
* . hit the end of the buffer. (loop)
*/
if (c == '\n') {
- *cp = *buf = 0;
- advise (NULL, "eol encountered in field \"%s\"", name);
- state = FMTERR;
- goto finish;
+ /* We hit the end of the line without seeing ':' to
+ * terminate the field name. This is usually (always?)
+ * spam. But, blowing up is lame, especially when
+ * scan(1)ing a folder with such messages. Pretend such
+ * lines are the first of the body (at least mutt also
+ * handles it this way). */
+
+ /* See if buf can hold this line, since we were assuming
+ * we had a buffer of NAMESZ, not bufsz. */
+ /* + 1 for the newline */
+ if (bufsz < j + 1) {
+ /* No, it can't. Oh well, guess we'll blow up. */
+ *cp = *buf = 0;
+ advise (NULL, "eol encountered in field \"%s\"", name);
+ state = FMTERR;
+ goto finish;
+ }
+ memcpy (buf, name, j - 1);
+ buf[j - 1] = '\n';
+ buf[j] = '\0';
+ /* mhparse.c:get_content wants to find the position of the
+ * body start, but it thinks there's a blank line between
+ * the header and the body (naturally!), so seek back so
+ * that things line up even though we don't have that
+ * blank line in this case. Simpler parsers (e.g. mhl)
+ * get extra newlines, but that should be harmless enough,
+ * right? This is a corrupt message anyway. */
+ fseek (iob, ftell (iob) - 2, SEEK_SET);
+ return BODY;
}
if ((i -= j) <= 0) {
*cp = *buf = 0;
--- /dev/null
+#!/bin/sh
+
+# TODO: Move to a common file tests can source; need more framework...
+failed=0
+check() {
+ diff -u $expected $actual
+ if [ $? -ne 0 ]; then
+ failed=$((failed + 1))
+ fi
+}
+
+expected=$MH_TEST_DIR/$$.expected
+actual=$MH_TEST_DIR/$$.actual
+
+# Write message with bogus header field (missing blank line, really).
+msgfile=$(mhpath new)
+msgnum=$(basename $msgfile)
+cat > $msgfile <<EOF
+Date: Sun, 18 Dec 2005 00:52:39 +0100
+From: foo@example.edu
+To: bar@example.edu
+Subject: test
+This is a multi-part message in MIME format.
+
+I am a stupid spammer.
+EOF
+
+# check scan
+cat > $expected <<EOF
+ 11 12/18 foo@example.edu test<<This is a multi-part message in MIME forma
+EOF
+scan $msgnum > $actual 2>&1
+check
+
+# check show (mhl)
+cat > $expected <<EOF
+(Message inbox:11)
+
+Date: Sun, 18 Dec 2005 00:52:39 +0100
+To: bar@example.edu
+From: foo@example.edu
+Subject: test
+
+
+This is a multi-part message in MIME format.
+
+
+I am a stupid spammer.
+EOF
+show $msgnum > $actual 2>&1
+check
+
+# check mhshow
+cat > $expected <<EOF
+Date: Sun, 18 Dec 2005 00:52:39 +0100
+To: bar@example.edu
+From: foo@example.edu
+Subject: test
+
+
+part text/plain 70
+
+This is a multi-part message in MIME format.
+
+I am a stupid spammer.
+EOF
+mhshow -nopause $msgnum > $actual 2>&1
+check