From 8b4410a1f3cb75e3d92b61176397655d509f81ee Mon Sep 17 00:00:00 2001 From: Eric Gillespie Date: Wed, 13 Aug 2008 18:27:36 +0000 Subject: [PATCH] * 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. --- ChangeLog | 9 +++++ sbr/m_getfld.c | 33 +++++++++++++++--- test/tests/bad-input/test-header | 68 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 test/tests/bad-input/test-header diff --git a/ChangeLog b/ChangeLog index e33aec2..2e03ab6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-08-13 Eric Gillespie + + * 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 * test/tests/mhshow/test-qp: Test various valid and invalid diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index c542d52..bbf11fe 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -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 index 0000000..4832106 --- /dev/null +++ b/test/tests/bad-input/test-header @@ -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 < $expected < $actual 2>&1 +check + +# check show (mhl) +cat > $expected < $actual 2>&1 +check + +# check mhshow +cat > $expected < $actual 2>&1 +check -- 1.7.10.4