X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/61e09274bb3338efbd9c50f797751853c99dba3b..034abb1cc56e6b4d15282635ea46f276b97680d8:/sbr/mf.c diff --git a/sbr/mf.c b/sbr/mf.c index 975e3964..c8868178 100644 --- a/sbr/mf.c +++ b/sbr/mf.c @@ -8,16 +8,12 @@ */ #include -#include -#include #include /* * static prototypes */ -static char *getcpy (char *); -static void compress (char *, char *); -static int isat (char *); +static int isat (const char *); static int parse_address (void); static int phrase (char *); static int route_addr (char *); @@ -25,29 +21,11 @@ static int local_part (char *); static int domain (char *); static int route (char *); static int my_lex (char *); - - -static char * -getcpy (char *s) -{ - register char *p; - - if (!s) { -/* causes compiles to blow up because the symbol _cleanup is undefined - where did this ever come from? */ - /* _cleanup(); */ - abort(); - for(;;) - pause(); - } - p = mh_xmalloc ((size_t) (strlen (s) + 2)); - strcpy (p, s); - return p; -} +static int contains8bit (const char *); int -isfrom(char *string) +isfrom(const char *string) { return (strncmp (string, "From ", 5) == 0 || strncmp (string, ">From ", 6) == 0); @@ -55,7 +33,7 @@ isfrom(char *string) int -lequal (char *a, char *b) +lequal (const char *a, const char *b) { for (; *a; a++, b++) if (*b == 0) @@ -73,158 +51,8 @@ lequal (char *a, char *b) } -/* - * seekadrx() is tricky. We want to cover both UUCP-style and ARPA-style - * addresses, so for each list of addresses we see if we can find some - * character to give us a hint. - */ - - -#define CHKADR 0 /* undertermined address style */ -#define UNIXDR 1 /* UNIX-style address */ -#define ARPADR 2 /* ARPAnet-style address */ - - -static char *punctuators = ";<>.()[]"; -static char *vp = NULL; -static char *tp = NULL; - -static struct adrx adrxs1; - - -struct adrx * -seekadrx (char *addrs) -{ - static int state = CHKADR; - register char *cp; - register struct adrx *adrxp; - - if (state == CHKADR) - for (state = UNIXDR, cp = addrs; *cp; cp++) - if (strchr(punctuators, *cp)) { - state = ARPADR; - break; - } - - switch (state) { - case UNIXDR: - adrxp = uucpadrx (addrs); - break; - - case ARPADR: - default: - adrxp = getadrx (addrs); - break; - } - - if (adrxp == NULL) - state = CHKADR; - - return adrxp; -} - - -/* - * uucpadrx() implements a partial UUCP-style address parser. It's based - * on the UUCP notion that addresses are separated by spaces or commas. - */ - - -struct adrx * -uucpadrx (char *addrs) -{ - char *cp, *wp, *xp, *yp, *zp; - struct adrx *adrxp = &adrxs1; - - if (vp == NULL) { - vp = tp = getcpy (addrs); - compress (addrs, vp); - } - else - if (tp == NULL) { - free (vp); - vp = NULL; - return NULL; - } - - for (cp = tp; isspace ((unsigned char) *cp); cp++) - continue; - if (*cp == 0) { - free (vp); - vp = tp = NULL; - return NULL; - } - - if ((wp = strchr(cp, ',')) == NULL) { - if ((wp = strchr(cp, ' ')) != NULL) { - xp = wp; - while (isspace ((unsigned char) *xp)) - xp++; - if (*xp != 0 && isat (--xp)) { - yp = xp + 4; - while (isspace ((unsigned char) *yp)) - yp++; - if (*yp != 0) { - if ((zp = strchr(yp, ' ')) != NULL) - *zp = 0, tp = ++zp; - else - tp = NULL; - } - else - *wp = 0, tp = ++wp; - } - else - *wp = 0, tp = ++wp; - } - else - tp = NULL; - } - else - *wp = 0, tp = ++wp; - - if (adrxp->text) - free (adrxp->text); - adrxp->text = getcpy (cp); - adrxp->mbox = cp; - adrxp->host = adrxp->path = NULL; - if ((wp = strrchr(cp, '@')) != NULL) { - *wp++ = 0; - adrxp->host = *wp ? wp : NULL; - } - else - for (wp = cp + strlen (cp) - 4; wp >= cp; wp--) - if (isat (wp)) { - *wp++ = 0; - adrxp->host = wp + 3; - } - - adrxp->pers = adrxp->grp = adrxp->note = adrxp->err = NULL; - adrxp->ingrp = 0; - - return adrxp; -} - - -static void -compress (char *fp, char *tp) -{ - char c, *cp; - - for (c = ' ', cp = tp; (*tp = *fp++) != 0;) - if (isspace ((unsigned char) *tp)) { - if (c != ' ') - *tp++ = c = ' '; - } - else - c = *tp++; - - if (c == ' ' && cp < tp) - *--tp = 0; -} - - static int -isat (char *p) +isat (const char *p) { return (strncmp (p, " AT ", 4) && strncmp (p, " At ", 4) @@ -348,7 +176,7 @@ static struct adrx adrxs2; struct adrx * -getadrx (char *addrs) +getadrx (const char *addrs) { register char *bp; register struct adrx *adrxp = &adrxs2; @@ -369,7 +197,7 @@ getadrx (char *addrs) err[0] = 0; if (dp == NULL) { - dp = cp = getcpy (addrs ? addrs : ""); + dp = cp = strdup (addrs ? addrs : ""); glevel = 0; } else @@ -403,6 +231,15 @@ getadrx (char *addrs) break; } + /* + * Reject the address if key fields contain 8bit characters + */ + + if (contains8bit(mbox) || contains8bit(host) || contains8bit(path) || + contains8bit(grp)) { + strcpy(err, "Address contains 8-bit characters"); + } + if (err[0]) for (;;) { switch (last_lex) { @@ -450,7 +287,7 @@ again: ; switch (my_lex (buffer)) { case LX_ATOM: case LX_QSTR: - pers = getcpy (buffer); + pers = strdup (buffer); break; case LX_SEMI: @@ -704,7 +541,7 @@ domain (char *buffer) static int route (char *buffer) { - path = getcpy ("@"); + path = strdup ("@"); for (;;) { switch (my_lex (buffer)) { @@ -803,7 +640,7 @@ my_lex (char *buffer) if (--i < 0) { *bp = 0; note = note ? add (buffer, add (" ", note)) - : getcpy (buffer); + : strdup (buffer); return my_lex (buffer); } } @@ -891,15 +728,34 @@ got_atom: ; } +/* + * Return true if the string contains an 8-bit character + */ + +static int +contains8bit(const char *p) +{ + if (! p) + return 0; + + for (; *p; p++) { + if (! isascii((unsigned char) *p)) + return 1; + } + + return 0; +} + + char * -legal_person (char *p) +legal_person (const char *p) { int i; - register char *cp; + register const char *cp; static char buffer[BUFSIZ]; if (*p == '"') - return p; + return (char *) p; for (cp = p; *cp; cp++) for (i = 0; special[i].lx_chr; i++) if (*cp == special[i].lx_chr) { @@ -907,7 +763,7 @@ legal_person (char *p) return buffer; } - return p; + return (char *) p; }