Skip to content

Commit 9aa2309

Browse files
committed
mailinfo: apply the same fix not to lose NULs in BASE64 and QP codepaths
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent cce8d6f commit 9aa2309

File tree

4 files changed

+71
-21
lines changed

4 files changed

+71
-21
lines changed

builtin-mailinfo.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ static int read_one_header_line(char *line, int sz, FILE *in)
434434

435435
static int decode_q_segment(char *in, char *ot, unsigned otsize, char *ep, int rfc2047)
436436
{
437+
char *otbegin = ot;
437438
char *otend = ot + otsize;
438439
int c;
439440
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
453454
*ot++ = c;
454455
}
455456
*ot = 0;
456-
return 0;
457+
return (ot - otbegin);
457458
}
458459

459460
static int decode_b_segment(char *in, char *ot, unsigned otsize, char *ep)
460461
{
461462
/* Decode in..ep, possibly in-place to ot */
462463
int c, pos = 0, acc = 0;
464+
char *otbegin = ot;
463465
char *otend = ot + otsize;
464466

465467
while ((c = *in++) != 0 && (in <= ep)) {
@@ -505,7 +507,7 @@ static int decode_b_segment(char *in, char *ot, unsigned otsize, char *ep)
505507
}
506508
}
507509
*ot = 0;
508-
return 0;
510+
return (ot - otbegin);
509511
}
510512

511513
/*
@@ -623,21 +625,20 @@ static void decode_header(char *it, unsigned itsize)
623625
convert_to_utf8(it, itsize, "");
624626
}
625627

626-
static void decode_transfer_encoding(char *line, unsigned linesize)
628+
static int decode_transfer_encoding(char *line, unsigned linesize, int inputlen)
627629
{
628630
char *ep;
629631

630632
switch (transfer_encoding) {
631633
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);
635636
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);
639639
case TE_DONTCARE:
640-
break;
640+
default:
641+
return inputlen;
641642
}
642643
}
643644

@@ -806,17 +807,19 @@ static void handle_body(void)
806807
/* process any boundary lines */
807808
if (content_top->boundary && is_multipart_boundary(line)) {
808809
/* flush any leftover */
809-
if ((transfer_encoding == TE_BASE64) &&
810-
(np != newline)) {
810+
if (np != newline)
811811
handle_filter(newline, sizeof(newline),
812-
strlen(newline));
813-
}
812+
np - newline);
814813
if (!handle_boundary())
815814
return;
816815
}
817816

818817
/* 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+
}
820823

821824
switch (transfer_encoding) {
822825
case TE_BASE64:
@@ -830,13 +833,13 @@ static void handle_body(void)
830833
break;
831834
}
832835

833-
/* this is a decoded line that may contain
836+
/*
837+
* This is a decoded line that may contain
834838
* multiple new lines. Pass only one chunk
835839
* at a time to handle_filter()
836840
*/
837-
838841
do {
839-
while (*op != '\n' && *op != 0)
842+
while (op < line + len && *op != '\n')
840843
*np++ = *op++;
841844
*np = *op;
842845
if (*np != 0) {
@@ -846,9 +849,10 @@ static void handle_body(void)
846849
rc = handle_filter(newline, sizeof(newline), np - newline);
847850
np = newline;
848851
}
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().
852856
*/
853857
break;
854858
}

t/t5100-mailinfo.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,13 @@ test_expect_success 'respect NULs' '
3434
3535
'
3636

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+
3746
test_done

t/t5100/nul-b64.expect

1.63 KB
Binary file not shown.

t/t5100/nul-b64.in

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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==

0 commit comments

Comments
 (0)