summaryrefslogtreecommitdiff
path: root/mailinfo.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2006-05-23 19:53:20 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-05-23 21:08:32 (GMT)
commitf30b20282babcd77bcadef70b4e36e24cd1f6d59 (patch)
tree777f2dfb14ecfbd3ea11ba4f983ac1ce57af9e6f /mailinfo.c
parent1f36bee67e604735bc48be7fc731a823e6c5807f (diff)
downloadgit-f30b20282babcd77bcadef70b4e36e24cd1f6d59.zip
git-f30b20282babcd77bcadef70b4e36e24cd1f6d59.tar.gz
git-f30b20282babcd77bcadef70b4e36e24cd1f6d59.tar.bz2
More accurately detect header lines in read_one_header_line
Only count lines of the form '^.*: ' and '^From ' as email header lines. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'mailinfo.c')
-rw-r--r--mailinfo.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/mailinfo.c b/mailinfo.c
index 99989c2..a2b15e2 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -385,20 +385,29 @@ 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)
- return ofs;
+ break;
len = eatspace(line + ofs);
if (len == 0)
- return ofs;
- peek = fgetc(in); ungetc(peek, in);
- if (peek == ' ' || peek == '\t') {
- /* Yuck, 2822 header "folding" */
- ofs += len;
- continue;
+ break;
+ colon = strchr(line, ':');
+ if (!colon || !isspace(colon[1])) {
+ /* Re-add the newline */
+ line[ofs + len] = '\n';
+ line[ofs + len + 1] = '\0';
+ break;
}
- return ofs + len;
+ ofs += len;
+ /* Yuck, 2822 header "folding" */
+ peek = fgetc(in); ungetc(peek, in);
+ if (peek != ' ' && peek != '\t')
+ break;
}
+ /* Count mbox From headers as headers */
+ if (!ofs && !memcmp(line, "From ", 5))
+ ofs = 1;
return ofs;
}