Code

More accurately detect header lines in read_one_header_line
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 23 May 2006 19:53:20 +0000 (13:53 -0600)
committerJunio C Hamano <junkio@cox.net>
Tue, 23 May 2006 21:08:32 +0000 (14:08 -0700)
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>
mailinfo.c

index 99989c25b28a70043b866ab21cf6d88c45bc68ed..a2b15e2624702c90bd05d5a457df4c03694020c3 100644 (file)
@@ -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;
 }