Whoops, user & port were in the wrong order so msgchk didn't work for POP
[mmh] / sbr / m_getfld.c
index bbf11fe..be871c4 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * m_getfld.c -- read/parse a message
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
@@ -346,7 +344,7 @@ m_getfld (int state, unsigned char *name, unsigned char *buf,
                }
                if ((i -= j) <= 0) {
                    *cp = *buf = 0;
-                   advise (NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 1);
+                   advise (NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 2);
                    state = LENERR;
                    goto finish;
                }
@@ -522,22 +520,35 @@ m_getfld (int state, unsigned char *name, unsigned char *buf,
                    ep = bp + c - 1;
                    if ((sp = pat_map[*ep])) {
                        do {
-                           cp = sp;
-                           while (*--ep == *--cp)
-                           ;
-                           if (cp < fdelim) {
-                               if (ep >= bp)
-                                   /*
-                                    * ep < bp means that all the buffer
-                                    * contains is a prefix of delim.
-                                    * If this prefix is really a delim, the
-                                    * m_eom call at entry should have found
-                                    * it.  Thus it's not a delim and we can
-                                    * take all of it.
+                           /* This if() is true unless (a) the buffer is too
+                            * small to contain this delimiter prefix, or
+                            * (b) it contains exactly enough chars for the
+                            * delimiter prefix.
+                            * For case (a) obviously we aren't going to match.
+                            * For case (b), if the buffer really contained exactly
+                            * a delim prefix, then the m_eom call at entry
+                            * should have found it.  Thus it's not a delim
+                            * and we know we won't get a match.
+                            */
+                           if (((sp - fdelim) + 2) <= c) {
+                               cp = sp;
+                               /* Unfortunately although fdelim has a preceding NUL
+                                * we can't use this as a sentinel in case the buffer
+                                * contains a NUL in exactly the wrong place (this
+                                * would cause us to run off the front of fdelim).
+                                */
+                               while (*--ep == *--cp)
+                                   if (cp < fdelim)
+                                       break;
+                               if (cp < fdelim) {
+                                   /* we matched the entire delim prefix,
+                                    * so only take the buffer up to there.
+                                    * we know ep >= bp -- check above prevents underrun
                                     */
                                    c = (ep - bp) + 2;
-                           break;
-                       }
+                                   break;
+                               }
+                           }
                            /* try matching one less char of delim string */
                            ep = bp + c - 1;
                        } while (--sp > fdelim);