diff options
Diffstat (limited to 'builtin-mailinfo.c')
-rw-r--r-- | builtin-mailinfo.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index f974b9df96..e890f7a6d1 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -107,7 +107,7 @@ static void handle_from(const struct strbuf *from) el = strcspn(at, " \n\t\r\v\f>"); strbuf_reset(&email); strbuf_add(&email, at, el); - strbuf_remove(&f, at - f.buf, el + 1); + strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0)); /* The remainder is name. It could be "John Doe <john.doe@xz>" * or "john.doe@xz (John Doe)", but we have removed the @@ -175,7 +175,7 @@ static void handle_content_type(struct strbuf *line) message_type = TYPE_OTHER; if (slurp_attr(line->buf, "boundary=", boundary)) { strbuf_insert(boundary, 0, "--", 2); - if (content_top++ >= &content[MAX_BOUNDARIES]) { + if (++content_top > &content[MAX_BOUNDARIES]) { fprintf(stderr, "Too many boundaries to handle\n"); exit(1); } @@ -203,7 +203,8 @@ static void handle_content_transfer_encoding(const struct strbuf *line) static int is_multipart_boundary(const struct strbuf *line) { - return !strbuf_cmp(line, *content_top); + return (((*content_top)->len <= line->len) && + !memcmp(line->buf, (*content_top)->buf, (*content_top)->len)); } static void cleanup_subject(struct strbuf *subject) @@ -602,7 +603,7 @@ static void handle_filter(struct strbuf *line); static int find_boundary(void) { while (!strbuf_getline(&line, fin, '\n')) { - if (is_multipart_boundary(&line)) + if (*content_top && is_multipart_boundary(&line)) return 1; } return 0; @@ -625,7 +626,7 @@ again: /* technically won't happen as is_multipart_boundary() will fail first. But just in case.. */ - if (content_top-- < content) { + if (--content_top < content) { fprintf(stderr, "Detected mismatched boundaries, " "can't recover\n"); exit(1); @@ -649,8 +650,11 @@ again: check_header(&line, p_hdr_data, 0); strbuf_release(&newline); - /* eat the blank line after section info */ - return (strbuf_getline(&line, fin, '\n') == 0); + /* replenish line */ + if (strbuf_getline(&line, fin, '\n')) + return 0; + strbuf_addch(&line, '\n'); + return 1; } static inline int patchbreak(const struct strbuf *line) @@ -757,9 +761,10 @@ static void handle_body(void) /* process any boundary lines */ if (*content_top && is_multipart_boundary(&line)) { /* flush any leftover */ - if (line.len) - handle_filter(&line); - + if (prev.len) { + handle_filter(&prev); + strbuf_reset(&prev); + } if (!handle_boundary()) goto handle_body_out; } |