X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fm_getfld.c;h=e139505aa941f6d416bf458d26679853dffca43c;hb=5e5e8b753acc7ff1e16c7fca172a2151a6c01353;hp=9424188fb8b8c1e6927285eefdc9c869ff1bd10a;hpb=3fcd202c63415345fbafe735a02cb040e3879aa9;p=mmh diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index 9424188..e139505 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -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. @@ -190,14 +188,11 @@ static int (*eom_action)(int) = NULL; # define _cnt _r /* Retch */ # define _filbuf __srget /* Puke */ # define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC -#endif -#ifdef SCO_5_STDIO -# define _ptr __ptr -# define _cnt __cnt -# define _base __base -# define _filbuf(fp) ((fp)->__cnt = 0, __filbuf(fp)) -# define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC +# if defined __CYGWIN__ + /* Cygwin's stdio.h does not declare __srget(). */ + int __srget(FILE *); +# endif /* __CYGWIN__ */ #endif #ifndef DEFINED__FILBUF_TO_SOMETHING_SPECIFIC @@ -522,22 +517,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); @@ -571,10 +579,6 @@ finish: } -#ifdef RPATHS -static char unixbuf[BUFSIZ] = ""; -#endif /* RPATHS */ - void m_unknown(FILE *iob) { @@ -604,15 +608,8 @@ m_unknown(FILE *iob) && strncmp (text, "From ", 5) == 0) { msg_style = MS_MBOX; delimstr = "\nFrom "; -#ifndef RPATHS while ((c = getc (iob)) != '\n' && c >= 0) ; -#else /* RPATHS */ - cp = unixbuf; - while ((c = getc (iob)) != '\n' && cp - unixbuf < BUFSIZ - 1) - *cp++ = c; - *cp = 0; -#endif /* RPATHS */ } else { /* not a Unix style maildrop */ fseek (iob, pos, SEEK_SET); @@ -681,9 +678,6 @@ m_Eom (int c, FILE *iob) register long pos = 0L; register int i; char text[10]; -#ifdef RPATHS - register char *cp; -#endif /* RPATHS */ pos = ftell (iob); if ((i = fread (text, sizeof *text, edelimlen, iob)) != edelimlen @@ -704,83 +698,15 @@ m_Eom (int c, FILE *iob) } if (msg_style == MS_MBOX) { -#ifndef RPATHS while ((c = getc (iob)) != '\n') if (c < 0) break; -#else /* RPATHS */ - cp = unixbuf; - while ((c = getc (iob)) != '\n' && c >= 0 && cp - unixbuf < BUFSIZ - 1) - *cp++ = c; - *cp = 0; -#endif /* RPATHS */ } return 1; } -#ifdef RPATHS -/* - * Return the Return-Path and Delivery-Date - * header information. - * - * Currently, I'm assuming that the "From " line - * takes one of the following forms. - * - * From sender date remote from host (for UUCP delivery) - * From sender@host date (for sendmail delivery) - */ - -int -get_returnpath (char *rp, int rplen, char *dd, int ddlen) -{ - char *ap, *bp, *cp, *dp; - - ap = unixbuf; - if (!(bp = cp = strchr(ap, ' '))) - return 0; - - /* - * Check for "remote from" in envelope to see - * if this message uses UUCP style addressing - */ - while ((cp = strchr(++cp, 'r'))) { - if (strncmp (cp, "remote from", 11) == 0) { - cp = strrchr (cp, ' '); - break; - } - } - - /* - * Get the Return-Path information from - * the "From " envelope. - */ - if (cp) { - /* return path for UUCP style addressing */ - dp = strchr (++cp, '\n'); - snprintf (rp, rplen, "%.*s!%.*s\n", (int)(dp - cp), cp, (int)(bp - ap), ap); - } else { - /* return path for standard domain addressing */ - snprintf (rp, rplen, "%.*s\n", (int)(bp - ap), ap); - } - - /* - * advance over the spaces to get to - * delivery date on envelope - */ - while (*bp == ' ') - bp++; - - /* Now get delivery date from envelope */ - snprintf (dd, ddlen, "%.*s\n", 24, bp); - - unixbuf[0] = 0; - return 1; -} -#endif /* RPATHS */ - - static unsigned char * matchc(int patln, char *pat, int strln, char *str) {