diff options
author | Junio C Hamano <gitster@pobox.com> | 2023-12-28 01:52:24 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-12-28 01:52:24 +0300 |
commit | db2cf6f3bbab88631d98ec737591b52ae4d87251 (patch) | |
tree | 061516d04736d609fbd6857b0a9f1ff1e1e401f4 | |
parent | f09e74175dfa5b46587dab3c5dcbad16e9586de3 (diff) | |
parent | d1bd3a8c3424e818f4117a39fe418909e24cea5f (diff) |
Merge branch 'jk/mailinfo-oob-read-fix'
OOB read fix.
* jk/mailinfo-oob-read-fix:
mailinfo: fix out-of-bounds memory reads in unquote_quoted_pair()
-rw-r--r-- | mailinfo.c | 8 | ||||
-rwxr-xr-x | t/t5100-mailinfo.sh | 22 |
2 files changed, 26 insertions, 4 deletions
diff --git a/mailinfo.c b/mailinfo.c index 093bed5d8f..9681864216 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -58,12 +58,12 @@ static void parse_bogus_from(struct mailinfo *mi, const struct strbuf *line) static const char *unquote_comment(struct strbuf *outbuf, const char *in) { - int c; int take_next_literally = 0; strbuf_addch(outbuf, '('); - while ((c = *in++) != 0) { + while (*in) { + int c = *in++; if (take_next_literally == 1) { take_next_literally = 0; } else { @@ -88,10 +88,10 @@ static const char *unquote_comment(struct strbuf *outbuf, const char *in) static const char *unquote_quoted_string(struct strbuf *outbuf, const char *in) { - int c; int take_next_literally = 0; - while ((c = *in++) != 0) { + while (*in) { + int c = *in++; if (take_next_literally == 1) { take_next_literally = 0; } else { diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index db11cababd..654d8cf3ee 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -268,4 +268,26 @@ test_expect_success 'mailinfo warn CR in base64 encoded email' ' test_must_be_empty quoted-cr/0002.err ' +test_expect_success 'from line with unterminated quoted string' ' + echo "From: bob \"unterminated string smith <bob@example.com>" >in && + git mailinfo /dev/null /dev/null <in >actual && + cat >expect <<-\EOF && + Author: bob unterminated string smith + Email: bob@example.com + + EOF + test_cmp expect actual +' + +test_expect_success 'from line with unterminated comment' ' + echo "From: bob (unterminated comment smith <bob@example.com>" >in && + git mailinfo /dev/null /dev/null <in >actual && + cat >expect <<-\EOF && + Author: bob (unterminated comment smith + Email: bob@example.com + + EOF + test_cmp expect actual +' + test_done |