From: David Levine Date: Fri, 11 Jan 2013 04:52:59 +0000 (-0600) Subject: Started revising m_getfld() code to replace direct buffer X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/683e0fb1a14da5b9ce7bc5db6e76951d14d79348?hp=--cc Started revising m_getfld() code to replace direct buffer access with Getc(). The goal is to again support fseek() after return from m_getfld(). --- 683e0fb1a14da5b9ce7bc5db6e76951d14d79348 diff --git a/Makefile.am b/Makefile.am index 54d37c2c..b8beb22b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -237,6 +237,7 @@ EXTRA_DIST = config/version.sh sbr/sigmsg.awk etc/mts.conf.in \ man/unseen.man man/whatnow.man man/whom.man \ test/README test/fakesendmail $(TESTS) test/inc/deb359167.mbox \ test/inc/fromline.txt test/inc/msgheader.txt test/inc/filler.txt \ + test/inc/lots_of_headers.txt test/inc/malformed_message.txt \ test/inc/md5sums test/mhmail/attachment.txt \ test/post/test-post-common.sh uip/mhmail \ SPECS/nmh.spec SPECS/build-nmh-cygwin diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index dc799ba1..8e11ed96 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -365,29 +365,21 @@ m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf, cp = name; i = NAMESZ - 1; for (;;) { - /* Store current position, ungetting the last character. */ - bp = sp = (unsigned char *) m.readpos - 1; - j = (cnt = m.end - m.readpos + 1) < i ? cnt : i; - while (--j >= 0 && (c = *bp++) != ':' && c != '\n') { + /* Get the field name. The first time through the + loop, this copies out the first character, which + was loaded into c prior to loop entry.*/ + for (j = 0; + c != ':' && c != '\n' && j < i; + ++j, ++bytes_read, c = Getc (iob)) { *cp++ = c; - ++bytes_read; } + ++j; - j = bp - sp; - if ((cnt -= j) <= 0) { - /* Next to force refill of the buffer here. */ - m.readpos = m.end; - if (Getc (iob) == EOF) { - *bufsz = *cp = *buf = 0; - advise (NULL, "eof encountered in field \"%s\"", name); - return FMTERR; - } - } else { - /* Restore the current offset. */ - /* j was set to be less than or equal to the number of - bytes available, so we can't overrun the end of the - message buffer. */ - m.readpos = bp + 1; + /* Advance to character after ':' or '\n'. */ + if (Getc (iob) == EOF) { + *bufsz = *cp = *buf = 0; + advise (NULL, "eof encountered in field \"%s\"", name); + return FMTERR; } if (c == ':') break; @@ -409,6 +401,7 @@ m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf, /* 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. */ *bufsz = *cp = *buf = 0; diff --git a/test/inc/lots_of_headers.txt b/test/inc/lots_of_headers.txt new file mode 100644 index 00000000..45e3d6d2 --- /dev/null +++ b/test/inc/lots_of_headers.txt @@ -0,0 +1,112 @@ +Received: The important characteristic of this message is that the 8193'd +Received: character is the ':' at the end of header field name. That's +Received: tests some logic in m_getfld (). +Received: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +Received: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB +Received: CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +Received: DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD +Received: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +Received: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +Received: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG +Received: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +Received: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII +Received: JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +Received: KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +Received: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +Received: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +Received: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +Received: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +Received: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +Received: QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +Received: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR +Received: SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS +Received: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +Received: UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU +Received: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV +Received: WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +Received: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Received: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY +Received: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ +Received: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Received: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +Received: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +Received: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +Received: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +Received: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +Received: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +Received: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +Received: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +Received: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +Received: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +Received: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +Received: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm +Received: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +Received: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +Received: pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp +Received: qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq +Received: rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +Received: ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss +Received: tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt +Received: uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu +Received: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +Received: wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww +Received: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +Received: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +Received: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +Received: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +Received: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB +Received: CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +Received: DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD +Received: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +Received: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +Received: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG +Received: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +Received: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII +Received: JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +Received: KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +Received: LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +Received: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +Received: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +Received: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +Received: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +Received: QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ +Received: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR +Received: SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS +Received: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +Received: UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU +Received: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV +Received: WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +Received: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Received: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY +Received: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ +Received: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Received: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +Received: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +Received: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +Received: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +Received: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +Received: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +Received: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +Received: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +Received: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +Received: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +Received: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +Received: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm +Received: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +Received: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +Received: pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp +Received: qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq +Received: rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +Received: ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss +Received: tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt +Received: uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu +Received: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +Received: wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww +Received: 01234 +Received: This is it, the line with the 8193'd character of ':'. +Received: From somewhere +From: No Such User +To: Some Other User +Subject: all that and nothing to say? +Date: Thu, 10 Jan 2013 19:54:01 -0500 + diff --git a/test/inc/malformed_message.txt b/test/inc/malformed_message.txt new file mode 100644 index 00000000..62800b22 --- /dev/null +++ b/test/inc/malformed_message.txt @@ -0,0 +1 @@ +Received: \ No newline at end of file diff --git a/test/inc/md5sums b/test/inc/md5sums index 7f68baa3..b9745554 100644 --- a/test/inc/md5sums +++ b/test/inc/md5sums @@ -1,3 +1,5 @@ 4112b1460e11bd94d30944dd464a6662 filler.txt 023aad60eab43f06cf525869a833beb4 fromline.txt +0c4fd7cd528519e83011015bfae3e458 lots_of_headers.txt +34d3e95b7df44d62f685eaf95d823c92 malformed_message.txt 4fda7f16b29d757413cb928d6ffc5aa5 msgheader.txt diff --git a/test/inc/test-inc-scanout b/test/inc/test-inc-scanout index b66965a0..ec93999b 100755 --- a/test/inc/test-inc-scanout +++ b/test/inc/test-inc-scanout @@ -15,6 +15,12 @@ fi setup_test +thisdir="$srcdir/test/inc" +expected="$MH_TEST_DIR/$$.expected" +expected_err="$MH_TEST_DIR/$$.expected_err" +actual="$MH_TEST_DIR/$$.actual" +actual_err="$MH_TEST_DIR/$$.actual_err" + cat > "${MH_TEST_DIR}/test.mbox" <"$expected" <"$expected_err" <"$actual" 2>"$actual_err" + +check "$expected" "$actual" +check "$expected_err" "$actual_err" + + exit ${failed:-0}