@matheusbsbs / matheus-bagliano / commits / 9aa23094c2
Fork 0

mailinfo: apply the same fix not to lose NULs in BASE64 and QP codepaths

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed May 25, 2008 at 01:16 UTC 9aa23094c281d1333eecb6bb1bd84b1599197d68
4 files changed +71 -21
builtin-mailinfo.c
+25 -21
@@ -434,6 +434,7 @@ static int read_one_header_line(char *line, int sz, FILE *in)
434
435 static int decode_q_segment(char *in, char *ot, unsigned otsize, char *ep, int rfc2047)
436 {
437 + char *otbegin = ot;
438 char *otend = ot + otsize;
439 int c;
440 while ((c = *in++) != 0 && (in <= ep)) {
@@ -453,13 +454,14 @@ static int decode_q_segment(char *in, char *ot, unsigned otsize, char *ep, int r
454 *ot++ = c;
455 }
456 *ot = 0;
456 - return 0;
457 + return (ot - otbegin);
458 }
459
460 static int decode_b_segment(char *in, char *ot, unsigned otsize, char *ep)
461 {
462 /* Decode in..ep, possibly in-place to ot */
463 int c, pos = 0, acc = 0;
464 + char *otbegin = ot;
465 char *otend = ot + otsize;
466
467 while ((c = *in++) != 0 && (in <= ep)) {
@@ -505,7 +507,7 @@ static int decode_b_segment(char *in, char *ot, unsigned otsize, char *ep)
507 }
508 }
509 *ot = 0;
508 - return 0;
510 + return (ot - otbegin);
511 }
512
513 /*
@@ -623,21 +625,20 @@ static void decode_header(char *it, unsigned itsize)
625 convert_to_utf8(it, itsize, "");
626 }
627
626 -static void decode_transfer_encoding(char *line, unsigned linesize)
628 +static int decode_transfer_encoding(char *line, unsigned linesize, int inputlen)
629 {
630 char *ep;
631
632 switch (transfer_encoding) {
633 case TE_QP:
632 - ep = line + strlen(line);
633 - decode_q_segment(line, line, linesize, ep, 0);
634 - break;
634 + ep = line + inputlen;
635 + return decode_q_segment(line, line, linesize, ep, 0);
636 case TE_BASE64:
636 - ep = line + strlen(line);
637 - decode_b_segment(line, line, linesize, ep);
638 - break;
637 + ep = line + inputlen;
638 + return decode_b_segment(line, line, linesize, ep);
639 case TE_DONTCARE:
640 - break;
640 + default:
641 + return inputlen;
642 }
643 }
644
@@ -806,17 +807,19 @@ static void handle_body(void)
807 /* process any boundary lines */
808 if (content_top->boundary && is_multipart_boundary(line)) {
809 /* flush any leftover */
809 - if ((transfer_encoding == TE_BASE64) &&
810 - (np != newline)) {
810 + if (np != newline)
811 handle_filter(newline, sizeof(newline),
812 - strlen(newline));
813 - }
812 + np - newline);
813 if (!handle_boundary())
814 return;
815 }
816
817 /* Unwrap transfer encoding */
819 - decode_transfer_encoding(line, sizeof(line));
818 + len = decode_transfer_encoding(line, sizeof(line), len);
819 + if (len < 0) {
820 + error("Malformed input line");
821 + return;
822 + }
823
824 switch (transfer_encoding) {
825 case TE_BASE64:
@@ -830,13 +833,13 @@ static void handle_body(void)
833 break;
834 }
835
833 - /* this is a decoded line that may contain
836 + /*
837 + * This is a decoded line that may contain
838 * multiple new lines. Pass only one chunk
839 * at a time to handle_filter()
840 */
837 -
841 do {
839 - while (*op != '\n' && *op != 0)
842 + while (op < line + len && *op != '\n')
843 *np++ = *op++;
844 *np = *op;
845 if (*np != 0) {
@@ -846,9 +849,10 @@ static void handle_body(void)
849 rc = handle_filter(newline, sizeof(newline), np - newline);
850 np = newline;
851 }
849 - } while (*op != 0);
850 - /* the partial chunk is saved in newline and
851 - * will be appended by the next iteration of fgets
852 + } while (op < line + len);
853 + /*
854 + * The partial chunk is saved in newline and will be
855 + * appended by the next iteration of read_line_with_nul().
856 */
857 break;
858 }
t/t5100-mailinfo.sh
+9
@@ -34,4 +34,13 @@ test_expect_success 'respect NULs' '
34
35 '
36
37 +test_expect_success 'Preserve NULs out of MIME encoded message' '
38 +
39 + git mailsplit -d5 -o. ../t5100/nul-b64.in &&
40 + cmp ../t5100/nul-b64.in 00001 &&
41 + git mailinfo msg patch <00001 &&
42 + cmp ../t5100/nul-b64.expect patch
43 +
44 +'
45 +
46 test_done
t/t5100/nul-b64.expect
Binary files /dev/null and b/t/t5100/nul-b64.expect differ
t/t5100/nul-b64.in new
+37
@@ -0,0 +1,37 @@
1 +From 667d8940e719cddee1cfe237cbbe215e20270b09 Mon Sep 17 00:00:00 2001
2 +From: Junio C Hamano <gitster@pobox.com>
3 +Date: Sun, 25 May 2008 00:38:18 -0700
4 +Subject: [PATCH] second
5 +Content-Transfer-Encoding: base64
6 +
7 +LS0tCiBmaWxlIHwgIEJpbiAxMzU3IC0+IDEzNTcgYnl0ZXMKIDEgZmlsZXMgY2hhbmdlZCwg
8 +MCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2ZpbGUgYi9m
9 +aWxlCmluZGV4IDc3MzYxZDguLjllMDJiZTYgMTAwNjQ0Ci0tLSBhL2ZpbGUKKysrIGIvZmls
10 +ZQpAQCAtMSwxMiArMSwxMiBAQAogTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNl
11 +Y3RldHVlciBhZGlwaXNjaW5nIGVsaXQuIFN1c3BlbmRpc3NlCiBzaXQgYW1ldCB0dXJwaXMg
12 +ZWdldCBlc3QgY3Vyc3VzIGxhb3JlZXQuIEFsaXF1YW0gbWF1cmlzLiBQcmFlc2VudAotdm9s
13 +dXRwYXQuIFByb2luIGluIHB1cnVzLiBOdWxsYSB1cm5hIHNhcGllbiwgZGFwaWJ1cyBzaXQg
14 +YW1ldCwKK3ZvbHV0cGF0LiBQcm9pbiBpbiBwdXJ1cy4gTnVsbGEgdXJuYSBzYXBpZW4sIGRh
15 +cGkAdXMgc2l0IGFtZXQsCiBoZW5kcmVyaXQgbmVjLCB0ZW1wdXMgZXUsIG1pLiBVdCBwb3J0
16 +YSwgbGVvIGlkIHRpbmNpZHVudCB1bGxhbWNvcnBlciwKLXZlbGl0IGZlbGlzIHRyaXN0aXF1
17 +ZSBhbnRlLCBhdCBsb2JvcnRpcyBkaWFtIHBlZGUgdXQgZHVpLiBQcm9pbiBhYwordmVsaXQg
18 +ZmVsaXMgdHJpc3RpcXVlIGFudGUsIGF0IGxvAG9ydGlzIGRpYW0gcGVkZSB1dCBkdWkuIFBy
19 +b2luIGFjCiBsZWN0dXMuIERvbmVjIGF0IG1hc3NhIGFjIGlwc3VtIGhlbmRyZXJpdCBzb2xs
20 +aWNpdHVkaW4uIE5hbSBkaWN0dW0KIG5pc2kgc2VkIG1pLiBEdWlzIHNlZCBhbnRlLiBVdCB2
21 +aXRhZSBlc3QgdXQgZHVpIHVsdHJpY2llcyBkaWduaXNzaW0uCiAKLUluIHZlbCBvZGlvIGVn
22 +ZXQgbmlzbCBjb252YWxsaXMgdm9sdXRwYXQuIE1vcmJpIHZpdGFlIG5pYmguIE51bGxhbQor
23 +SW4gdmVsIG9kaW8gZWdldCBuaXNsIGNvbnZhbGxpcyB2b2x1dHBhdC4gTW9yAGkgdml0YWUg
24 +bmkAaC4gTnVsbGFtCiBhY2N1bXNhbiwgZG9sb3IgcXVpcyBhbGlxdWFtIHNjZWxlcmlzcXVl
25 +LCBlbGl0IGVuaW0gY29uZGltZW50dW0KIG1hdXJpcywgbm9uIHRyaXN0aXF1ZSBtYXVyaXMg
26 +dHVycGlzIGV0IG1hdXJpcy4gVXQgbm9uIG5pc2wuIE5hbSBkaWFtCiBtaSwgc2VtcGVyIHBv
27 +c3VlcmUsIGVsZWlmZW5kIHV0LCBhdWN0b3IgdmVsLCBlcmF0LiBTZWQgcG9zdWVyZQpAQCAt
28 +MTYsNyArMTYsNyBAQCBzZWQgZXN0LiBFdGlhbSBkaWFtIGZlbGlzLCBmZXJtZW50dW0gZWdl
29 +dCwgYWRpcGlzY2luZyBhdCwgcG9zdWVyZSBpbiwKIGR1aS4gRXRpYW0gbHVjdHVzLgogCiBO
30 +dWxsYSBpZCBhdWd1ZS4gTmFtIGlhY3VsaXMgYWNjdW1zYW4gbmlzaS4gU3VzcGVuZGlzc2Ug
31 +cG90ZW50aS4gTnVuYwotdmFyaXVzIGF1Z3VlIG5lYyBvcmNpLiBVdCBjb25kaW1lbnR1bSBk
32 +b2xvciBzYWdpdHRpcyBuaWJoLiBTdXNwZW5kaXNzZQordmFyaXVzIGF1Z3VlIG5lYyBvcmNp
33 +LiBVdCBjb25kaW1lbnR1bSBkb2xvciBzYWdpdHRpcyBuaQBoLiBTdXNwZW5kaXNzZQogdGVt
34 +cG9yIGxlY3R1cyBzZWQgbWFnbmEuIFN1c3BlbmRpc3NlIHBvdGVudGkuIE51bGxhbSB0ZW1w
35 +b3IgaXBzdW0uIFNlZAogbW9sZXN0aWUgdGVsbHVzLiBQaGFzZWxsdXMgbGlndWxhLiBJbiB2
36 +ZWhpY3VsYSB1bHRyaWNlcwogbmlzaS4gU3VzcGVuZGlzc2UgZmVsaXMgYXVndWUsIHBlbGxl
37 +bnRlc3F1ZSBhdCwgZGljdHVtIHZpdmVycmEsCi0tIAoxLjUuNS4xLjU0MC5nNTc3ODAKCg==