From 68864089c062ee04e4a4e61e667d590e1c4e494f Mon Sep 17 00:00:00 2001 From: David Levine Date: Tue, 15 Jan 2013 22:56:33 -0600 Subject: [PATCH 1/1] Added check of a header with name that's 998 bytes long to test-header. --- sbr/m_getfld.c | 10 +++++++--- test/bad-input/malformed_message.txt | 4 ++-- test/bad-input/test-header | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index b5bb0a32..82b9c3e8 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -428,7 +428,7 @@ m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf, into c prior to loop entry. Initialize j to 1 to account for that. */ for (j = 1; - c != ':' && c != '\n' && c != EOF && j <= i; + c != ':' && c != '\n' && c != EOF && j < i; ++j, c = Getc (iob)) { *cp++ = c; } @@ -478,9 +478,13 @@ m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf, *bufsz = --m.bytes_read; /* == j - 1 */ leave_getfld (&m, iob); return BODY; - } else if ((i -= j) <= 0) { + } else if (i <= j) { + /* By design, the loop above discards the last character + it had read. It's in c, use it. */ + *cp++ = c; *bufsz = *cp = *buf = 0; - advise (NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 2); + advise (NULL, "field name \"%s\" exceeds %d bytes", name, + NAMESZ - 2); state = LENERR; break; /* to finish */ } diff --git a/test/bad-input/malformed_message.txt b/test/bad-input/malformed_message.txt index 2d1d7c62..776fce10 100644 --- a/test/bad-input/malformed_message.txt +++ b/test/bad-input/malformed_message.txt @@ -1,2 +1,2 @@ -Date: Sat, 12 Jan 2013 09:07:01 -0600 -Received: \ No newline at end of file +Date: Tue, 15 Jan 2013 21:13:12 -0600 +ThisHeaderFieldNameIsWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayTooLong: OK diff --git a/test/bad-input/test-header b/test/bad-input/test-header index 4194b39b..abf8c979 100755 --- a/test/bad-input/test-header +++ b/test/bad-input/test-header @@ -75,6 +75,7 @@ mhshow -nopause $msgnum > "$actual" 2>&1 check "$expected" "$actual" # check m_getfld() handling of empty header field +printf 'Date: Sat, 12 Jan 2013 09:07:01 -0600\nReceived:' >"$MH_TEST_DIR/mess" cat >"$expected" <"$actual" 2>"$actual_err" +scan -width 13 -file "$MH_TEST_DIR/mess" >"$actual" 2>"$actual_err" +check "$expected" "$actual" +check "$expected_err" "$actual_err" +rm -f "$MH_TEST_DIR/mess" + +# check m_getfld() handling of excessively long header field name +cat >"$expected" <"$expected_err" <"$actual" 2>"$actual_err" check "$expected" "$actual" check "$expected_err" "$actual_err" -- 2.48.1