summaryrefslogtreecommitdiff
path: root/mailinfo.c
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <junkio@cox.net>2006-05-26 00:51:05 -0700
committerLibravatar Junio C Hamano <junkio@cox.net>2006-05-26 00:51:05 -0700
commit3c38f60c339839869f97448fd7a27551f97cec12 (patch)
treeab164d059a929158708f259f5d08c062c6e54d28 /mailinfo.c
parentMerge branch 'ew/tests' into next (diff)
parentmailinfo: More carefully parse header lines in read_one_header_line() (diff)
downloadtgif-3c38f60c339839869f97448fd7a27551f97cec12.tar.xz
Merge branch 'eb/mailinfo' into next
* eb/mailinfo: mailinfo: More carefully parse header lines in read_one_header_line()
Diffstat (limited to 'mailinfo.c')
-rw-r--r--mailinfo.c27
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';