X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=builtin-mailinfo.c;h=dacc8ac2d0e63e46dd1aa8fee6ba949bdd319e43;hb=2990034f1ed2c3d85d23d5611a1f04d317f785ac;hp=b99a5b6f9679061d75e9c48e2fa5877e27920dc3;hpb=93310a40eb022a0e36e7c618921931d8ffc31fd1;p=git.git diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index b99a5b6f9..dacc8ac2d 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 " * or "john.doe@xz (John Doe)", but we have removed the @@ -115,10 +115,10 @@ static void handle_from(const struct strbuf *from) * the () pair at the end. */ strbuf_trim(&f); - if (f.buf[0] == '(') - strbuf_remove(&name, 0, 1); - if (f.len && f.buf[f.len - 1] == ')') + if (f.buf[0] == '(' && f.len && f.buf[f.len - 1] == ')') { + strbuf_remove(&f, 0, 1); strbuf_setlen(&f, f.len - 1); + } get_sane_name(&name, &f, &email); strbuf_release(&f); @@ -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) @@ -429,13 +430,6 @@ static struct strbuf *decode_b_segment(const struct strbuf *b_seg) c -= 'a' - 26; else if ('0' <= c && c <= '9') c -= '0' - 52; - else if (c == '=') { - /* padding is almost like (c == 0), except we do - * not output NUL resulting only from it; - * for now we just trust the data. - */ - c = 0; - } else continue; /* garbage */ switch (pos++) { @@ -513,7 +507,25 @@ static int decode_header_bq(struct strbuf *it) rfc2047 = 1; if (in != ep) { - strbuf_add(&outbuf, in, ep - in); + /* + * We are about to process an encoded-word + * that begins at ep, but there is something + * before the encoded word. + */ + char *scan; + for (scan = in; scan < ep; scan++) + if (!isspace(*scan)) + break; + + if (scan != ep || in == it->buf) { + /* + * We should not lose that "something", + * unless we have just processed an + * encoded-word, and there is only LWS + * before the one we are about to process. + */ + strbuf_add(&outbuf, in, ep - in); + } in = ep; } /* E.g. @@ -602,7 +614,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 +637,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 +661,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 +772,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; } @@ -855,6 +871,7 @@ static void handle_info(void) } output_header_lines(fout, "Subject", hdr); } else if (!memcmp(header[i], "From", 4)) { + cleanup_space(hdr); handle_from(hdr); fprintf(fout, "Author: %s\n", name.buf); fprintf(fout, "Email: %s\n", email.buf);