diff options
| author | Junio C Hamano <junkio@cox.net> | 2006-05-26 00:51:05 -0700 |
|---|---|---|
| committer | Junio C Hamano <junkio@cox.net> | 2006-05-26 00:51:05 -0700 |
| commit | 3c38f60c339839869f97448fd7a27551f97cec12 (patch) | |
| tree | ab164d059a929158708f259f5d08c062c6e54d28 | |
| parent | 3208ec9abd8e78970aa15ed0396a557140587058 (diff) | |
| parent | ef29c11702594e616cf43bea260515d9f14f17b0 (diff) | |
| download | git-3c38f60c339839869f97448fd7a27551f97cec12.tar.xz | |
Merge branch 'eb/mailinfo' into next
* eb/mailinfo:
mailinfo: More carefully parse header lines in read_one_header_line()
| -rw-r--r-- | mailinfo.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/mailinfo.c b/mailinfo.c index 78d2a15dd0..5b6c2157ed 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -389,19 +389,40 @@ static void check_header_line(char *line) check_header(line, header); } +static int is_rfc2822_header(char *line) +{ + /* + * The section that defines the loosest possible + * field name is "3.6.8 Optional fields". + * + * optional-field = field-name ":" unstructured CRLF + * field-name = 1*ftext + * ftext = %d33-57 / %59-126 + */ + int ch; + char *cp = line; + while ((ch = *cp++)) { + if (ch == ':') + return cp != line; + if ((33 <= ch && ch <= 57) || + (59 <= ch && ch <= 126)) + continue; + break; + } + return 0; +} + static int read_one_header_line(char *line, int sz, FILE *in) { int ofs = 0; while (ofs < sz) { - const char *colon; int peek, len; if (fgets(line + ofs, sz - ofs, in) == NULL) break; len = eatspace(line + ofs); if (len == 0) break; - colon = strchr(line, ':'); - if (!colon || !isspace(colon[1])) { + if (!is_rfc2822_header(line)) { /* Re-add the newline */ line[ofs + len] = '\n'; line[ofs + len + 1] = '\0'; |
