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==