X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fparse.c;h=67d9e148c3655e8e895153c710b76daa0965cf80;hb=ed72ace5f09d07c620b96efaf72d328d6e7439be;hp=e42e0c8a8e99e3c4388df389ed1b3f5dfe98286b;hpb=059ec3d9952740285fb1ebf47961b8aca2eb1b4a;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/parse.c b/src/src/parse.c index e42e0c8a8..67d9e148c 100644 --- a/src/src/parse.c +++ b/src/src/parse.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/parse.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */ +/* $Cambridge: exim/src/src/parse.c,v 1.7 2006/02/07 11:19:00 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2004 */ +/* Copyright (c) University of Cambridge 1995 - 2006 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for parsing addresses */ @@ -243,18 +243,17 @@ s = skip_comment(s); any character except [ ] \, including linear white space, and may contain quoted characters. However, RFC 821 restricts literals to being dot-separated 3-digit numbers, and we make the obvious extension for IPv6. Go for a sequence -of digits and dots (hex digits and colons for IPv6) here; later this will be -checked for being a syntactically valid IP address if it ever gets to a router. +of digits, dots, hex digits, and colons here; later this will be checked for +being a syntactically valid IP address if it ever gets to a router. -If IPv6 is supported, allow both the formal form, with IPV6: at the start, and -the informal form without it, and accept IPV4: as well, 'cause someone will use -it sooner or later. */ +Allow both the formal IPv6 form, with IPV6: at the start, and the informal form +without it, and accept IPV4: as well, 'cause someone will use it sooner or +later. */ if (*s == '[') { *t++ = *s++; - #if HAVE_IPV6 if (strncmpic(s, US"IPv6:", 5) == 0 || strncmpic(s, US"IPv4:", 5) == 0) { memcpy(t, s, 5); @@ -263,10 +262,6 @@ if (*s == '[') } while (*s == '.' || *s == ':' || isxdigit(*s)) *t++ = *s++; - #else - while (*s == '.' || isdigit(*s)) *t++ = *s++; - #endif - if (*s == ']') *t++ = *s++; else { *errorptr = US"malformed domain literal"; @@ -847,6 +842,11 @@ If the only characters that strictly need quoting are spaces, we return the original string, unmodified. If a quoted string is too long for the buffer, it is truncated. (This shouldn't happen: this is normally handling short strings.) +Hmmph. As always, things get perverted for other uses. This function was +originally for the "phrase" part of addresses. Now it is being used for much +longer texts in ACLs and via the ${rfc2047: expansion item. This means we have +to check for overlong "encoded-word"s and split them. November 2004. + Arguments: string the string to quote - already checked to contain non-printing chars @@ -866,7 +866,8 @@ parse_quote_2047(uschar *string, int len, uschar *charset, uschar *buffer, int buffer_size) { uschar *s = string; -uschar *t; +uschar *p, *t; +int hlen; BOOL coded = FALSE; if (charset == NULL) charset = US"iso-8859-1"; @@ -876,11 +877,25 @@ if (charset == NULL) charset = US"iso-8859-1"; if (!string_format(buffer, buffer_size, "=?%s?Q?", charset)) return US"String too long"; -t = buffer + Ustrlen(buffer); +hlen = Ustrlen(buffer); +t = buffer + hlen; +p = buffer; + for (; len > 0; len--) { int ch = *s++; - if (t > buffer + buffer_size - 8) break; + if (t > buffer + buffer_size - hlen - 8) break; + + if (t - p > 70) + { + *t++ = '?'; + *t++ = '='; + *t++ = ' '; + p = t; + Ustrncpy(p, buffer, hlen); + t += hlen; + } + if (ch < 33 || ch > 126 || Ustrchr("?=()<>@,;:\\\".[]_", ch) != NULL) { @@ -893,7 +908,11 @@ for (; len > 0; len--) } else *t++ = ch; } -sprintf(CS t, "?="); + +*t++ = '?'; +*t++ = '='; +*t = 0; + return coded? buffer : string; } @@ -1451,7 +1470,7 @@ for (;;) { *error = string_sprintf("failed to stat included file %s: %s", filename, strerror(errno)); - fclose(f); + (void)fclose(f); return FF_INCLUDEFAIL; } @@ -1478,11 +1497,11 @@ for (;;) { *error = string_sprintf("error while reading included file %s: %s", filename, strerror(errno)); - fclose(f); + (void)fclose(f); return FF_ERROR; } filebuf[statbuf.st_size] = 0; - fclose(f); + (void)fclose(f); addr = NULL; frc = parse_forward_list(filebuf, options, &addr,