From: Junio C Hamano Date: Mon, 8 Oct 2012 18:32:59 +0000 (-0700) Subject: Merge branch 'lt/mailinfo-handle-attachment-more-sanely' into maint X-Git-Tag: v1.7.12.3~5 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/6e2035715e35988917a88b14da3bbbce8351d920?ds=inline;hp=-c Merge branch 'lt/mailinfo-handle-attachment-more-sanely' into maint A patch attached as application/octet-stream (e.g. not text/*) were mishandled, not correctly honoring Content-Transfer-Encoding (e.g. base64). * lt/mailinfo-handle-attachment-more-sanely: mailinfo: don't require "text" mime type for attachments --- 6e2035715e35988917a88b14da3bbbce8351d920 diff --combined builtin/mailinfo.c index 9973bd9099,2405040ad3..fe128572f7 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@@ -19,9 -19,6 +19,6 @@@ static struct strbuf email = STRBUF_INI static enum { TE_DONTCARE, TE_QP, TE_BASE64 } transfer_encoding; - static enum { - TYPE_TEXT, TYPE_OTHER - } message_type; static struct strbuf charset = STRBUF_INIT; static int patch_lines; @@@ -160,9 -157,10 +157,9 @@@ static int slurp_attr(const char *line const char *ends, *ap = strcasestr(line, name); size_t sz; - if (!ap) { - strbuf_setlen(attr, 0); + strbuf_setlen(attr, 0); + if (!ap) return 0; - } ap += strlen(name); if (*ap == '"') { ap++; @@@ -184,8 -182,6 +181,6 @@@ static void handle_content_type(struct struct strbuf *boundary = xmalloc(sizeof(struct strbuf)); strbuf_init(boundary, line->len); - if (!strcasestr(line->buf, "text/")) - message_type = TYPE_OTHER; if (slurp_attr(line->buf, "boundary=", boundary)) { strbuf_insert(boundary, 0, "--", 2); if (++content_top > &content[MAX_BOUNDARIES]) { @@@ -231,9 -227,7 +226,9 @@@ static void cleanup_subject(struct strb case 'r': case 'R': if (subject->len <= at + 3) break; - if (!memcmp(subject->buf + at + 1, "e:", 2)) { + if ((subject->buf[at + 1] == 'e' || + subject->buf[at + 1] == 'E') && + subject->buf[at + 2] == ':') { strbuf_remove(subject, at, 3); continue; } @@@ -251,17 -245,8 +246,17 @@@ (7 <= remove && memmem(subject->buf + at, remove, "PATCH", 5))) strbuf_remove(subject, at, remove); - else + else { at += remove; + /* + * If the input had a space after the ], keep + * it. We don't bother with finding the end of + * the space, since we later normalize it + * anyway. + */ + if (isspace(subject->buf[at])) + at += 1; + } continue; } break; @@@ -681,7 -666,6 +676,6 @@@ again /* set some defaults */ transfer_encoding = TE_DONTCARE; strbuf_reset(&charset); - message_type = TYPE_TEXT; /* slurp in this section's info */ while (read_one_header_line(&line, fin)) @@@ -895,11 -879,6 +889,6 @@@ static void handle_body(void strbuf_insert(&line, 0, prev.buf, prev.len); strbuf_reset(&prev); - /* binary data most likely doesn't have newlines */ - if (message_type != TYPE_TEXT) { - handle_filter(&line); - break; - } /* * This is a decoded line that may contain * multiple new lines. Pass only one chunk