]> diplodocus.org Git - nmh/commitdiff
Started revising m_getfld() code to replace direct buffer
authorDavid Levine <levinedl@acm.org>
Fri, 11 Jan 2013 04:52:59 +0000 (22:52 -0600)
committerDavid Levine <levinedl@acm.org>
Fri, 11 Jan 2013 04:52:59 +0000 (22:52 -0600)
access with Getc().  The goal is to again support fseek()
after return from m_getfld().

Makefile.am
sbr/m_getfld.c
test/inc/lots_of_headers.txt [new file with mode: 0644]
test/inc/malformed_message.txt [new file with mode: 0644]
test/inc/md5sums
test/inc/test-inc-scanout

index 54d37c2c7ee1c899b58b63f7e809f40f2471b0e8..b8beb22b5cb8a98aadeb2a5fce3f4bd0c8f1ea16 100644 (file)
@@ -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 \
             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
             test/inc/md5sums test/mhmail/attachment.txt \
             test/post/test-post-common.sh uip/mhmail \
             SPECS/nmh.spec SPECS/build-nmh-cygwin
index dc799ba1d0881aff954f3887182eba93a9cd9ddb..8e11ed96bf373c0c25c198e166c0ef5a464de65c 100644 (file)
@@ -365,29 +365,21 @@ m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf,
            cp = name;
            i = NAMESZ - 1;
            for (;;) {
            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;
                    *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;
                }
                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 */
                    /* 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;
                    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 (file)
index 0000000..45e3d6d
--- /dev/null
@@ -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 <nosuch@example.com>
+To: Some Other User <someother@example.com>
+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 (file)
index 0000000..62800b2
--- /dev/null
@@ -0,0 +1 @@
+Received:
\ No newline at end of file
index 7f68baa3cb8151dd21cda9335754a8ad9e0bb506..b97455543beb5b9a4dc56c27224b638eaed9142c 100644 (file)
@@ -1,3 +1,5 @@
 4112b1460e11bd94d30944dd464a6662  filler.txt
 023aad60eab43f06cf525869a833beb4  fromline.txt
 4112b1460e11bd94d30944dd464a6662  filler.txt
 023aad60eab43f06cf525869a833beb4  fromline.txt
+0c4fd7cd528519e83011015bfae3e458  lots_of_headers.txt
+34d3e95b7df44d62f685eaf95d823c92  malformed_message.txt
 4fda7f16b29d757413cb928d6ffc5aa5  msgheader.txt
 4fda7f16b29d757413cb928d6ffc5aa5  msgheader.txt
index b66965a0fe3cc6fb36f6e82ae5a09e21ba4daaf5..ec93999ba8558f0c56d15f53c72e2d54c49db25a 100755 (executable)
@@ -15,6 +15,12 @@ fi
 
 setup_test
 
 
 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" <<EOF
 From nobody@nowhereville Jan 1 1970
 Received: I am the very model of a modern Major-General,
 cat > "${MH_TEST_DIR}/test.mbox" <<EOF
 From nobody@nowhereville Jan 1 1970
 Received: I am the very model of a modern Major-General,
@@ -195,4 +201,23 @@ rm -f "${MH_TEST_DIR}/test.mbox" "${MH_TEST_DIR}/test.mbox.2"
 run_test "scan -width 120 +inbox 11" \
        "  11+ 03/01 Mr Nobody          Who is on first?<<Abbott: Every dollar of it. And why not, the man's entitled to it. Cos"
 
 run_test "scan -width 120 +inbox 11" \
        "  11+ 03/01 Mr Nobody          Who is on first?<<Abbott: Every dollar of it. And why not, the man's entitled to it. Cos"
 
+# check header field name with ':' character than lands on m_getfld() buffer
+run_test "scan -width 60 -file $thisdir/lots_of_headers.txt" \
+         '   1  01/10 No Such User       all that and nothing to say?'
+
+cat >"$expected" <<EOF
+   1  01/10*
+EOF
+cat >"$expected_err" <<EOF
+scan: eof encountered in field "Received"
+??Format error (message -1) in component 1
+EOF
+
+# check m_getfld() handling of empty header field
+scan -width 13 -file "$thisdir"/malformed_message.txt >"$actual" 2>"$actual_err"
+
+check "$expected" "$actual"
+check "$expected_err" "$actual_err"
+
+
 exit ${failed:-0}
 exit ${failed:-0}