* test/tests/bad-input/test-header: Add test for it.
authorEric Gillespie <epg@pretzelnet.org>
Wed, 13 Aug 2008 18:27:36 +0000 (18:27 +0000)
committerEric Gillespie <epg@pretzelnet.org>
Wed, 13 Aug 2008 18:27:36 +0000 (18:27 +0000)
* 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.

ChangeLog
sbr/m_getfld.c
test/tests/bad-input/test-header [new file with mode: 0644]

index e33aec2..2e03ab6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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
index c542d52..bbf11fe 100644 (file)
@@ -314,10 +314,35 @@ m_getfld (int state, unsigned char *name, unsigned char *buf,
                 *  . 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;
diff --git a/test/tests/bad-input/test-header b/test/tests/bad-input/test-header
new file mode 100644 (file)
index 0000000..4832106
--- /dev/null
@@ -0,0 +1,68 @@
+#!/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