Skip to content

Commit 9d55b2e

Browse files
torvaldsgitster
authored andcommitted
mailinfo: don't require "text" mime type for attachments
Currently "git am" does insane things if the mbox it is given contains attachments with a MIME type that aren't "text/*". In particular, it will still decode them, and pass them "one line at a time" to the mail body filter, but because it has determined that they aren't text (without actually looking at the contents, just at the mime type) the "line" will be the encoding line (eg 'base64') rather than a line of *content*. Which then will cause the text filtering to fail, because we won't correctly notice when the attachment text switches from the commit message to the actual patch. Resulting in a patch failure, even if patch may be a perfectly well-formed attachment, it's just that the message type may be (for example) "application/octet-stream" instead of "text/plain". Just remove all the bogus games with the message_type. The only difference that code creates is how the data is passed to the filter function (chunked per-pred-code line or per post-decode line), and that difference is *wrong*, since chunking things per pre-decode line can never be a sensible operation, and cannot possibly matter for binary data anyway. This code goes all the way back to March of 2007, in commit 87ab799 ("builtin-mailinfo.c infrastrcture changes"), and apparently Don used to pass random mbox contents to git. However, the pre-decode vs post-decode logic really shouldn't matter even for that case, and more importantly, "I fed git am crap" is not a valid reason to break *real* patch attachments. If somebody really cares, and determines that some attachment is binary data (by looking at the data, not the MIME-type), the whole attachment should be dismissed, rather than fed in random-sized chunks to "handle_filter()". Signed-off-by: Linus Torvalds <[email protected]> Cc: Don Zickus <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d0f1ea6 commit 9d55b2e

File tree

1 file changed

+0
-11
lines changed

1 file changed

+0
-11
lines changed

builtin/mailinfo.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ static struct strbuf email = STRBUF_INIT;
1919
static enum {
2020
TE_DONTCARE, TE_QP, TE_BASE64
2121
} transfer_encoding;
22-
static enum {
23-
TYPE_TEXT, TYPE_OTHER
24-
} message_type;
2522

2623
static struct strbuf charset = STRBUF_INIT;
2724
static int patch_lines;
@@ -185,8 +182,6 @@ static void handle_content_type(struct strbuf *line)
185182
struct strbuf *boundary = xmalloc(sizeof(struct strbuf));
186183
strbuf_init(boundary, line->len);
187184

188-
if (!strcasestr(line->buf, "text/"))
189-
message_type = TYPE_OTHER;
190185
if (slurp_attr(line->buf, "boundary=", boundary)) {
191186
strbuf_insert(boundary, 0, "--", 2);
192187
if (++content_top > &content[MAX_BOUNDARIES]) {
@@ -671,7 +666,6 @@ static int handle_boundary(void)
671666
/* set some defaults */
672667
transfer_encoding = TE_DONTCARE;
673668
strbuf_reset(&charset);
674-
message_type = TYPE_TEXT;
675669

676670
/* slurp in this section's info */
677671
while (read_one_header_line(&line, fin))
@@ -885,11 +879,6 @@ static void handle_body(void)
885879
strbuf_insert(&line, 0, prev.buf, prev.len);
886880
strbuf_reset(&prev);
887881

888-
/* binary data most likely doesn't have newlines */
889-
if (message_type != TYPE_TEXT) {
890-
handle_filter(&line);
891-
break;
892-
}
893882
/*
894883
* This is a decoded line that may contain
895884
* multiple new lines. Pass only one chunk

0 commit comments

Comments
 (0)