Merge branch 'jk/mailinfo-iterative-unquote-comment' into maint-2.43

The code to parse the From e-mail header has been updated to avoid
recursion.

* jk/mailinfo-iterative-unquote-comment:
  mailinfo: avoid recursion when unquoting From headers
  t5100: make rfc822 comment test more careful
  mailinfo: fix out-of-bounds memory reads in unquote_quoted_pair()
This commit is contained in:
Junio C Hamano 2024-02-08 16:22:03 -08:00
commit 0e92593acf
4 changed files with 34 additions and 8 deletions

View file

@ -58,12 +58,13 @@ static void parse_bogus_from(struct mailinfo *mi, const struct strbuf *line)
static const char *unquote_comment(struct strbuf *outbuf, const char *in) static const char *unquote_comment(struct strbuf *outbuf, const char *in)
{ {
int c;
int take_next_literally = 0; int take_next_literally = 0;
int depth = 1;
strbuf_addch(outbuf, '('); strbuf_addch(outbuf, '(');
while ((c = *in++) != 0) { while (*in) {
int c = *in++;
if (take_next_literally == 1) { if (take_next_literally == 1) {
take_next_literally = 0; take_next_literally = 0;
} else { } else {
@ -72,11 +73,14 @@ static const char *unquote_comment(struct strbuf *outbuf, const char *in)
take_next_literally = 1; take_next_literally = 1;
continue; continue;
case '(': case '(':
in = unquote_comment(outbuf, in); strbuf_addch(outbuf, '(');
depth++;
continue; continue;
case ')': case ')':
strbuf_addch(outbuf, ')'); strbuf_addch(outbuf, ')');
return in; if (!--depth)
return in;
continue;
} }
} }
@ -88,10 +92,10 @@ static const char *unquote_comment(struct strbuf *outbuf, const char *in)
static const char *unquote_quoted_string(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; int take_next_literally = 0;
while ((c = *in++) != 0) { while (*in) {
int c = *in++;
if (take_next_literally == 1) { if (take_next_literally == 1) {
take_next_literally = 0; take_next_literally = 0;
} else { } else {

View file

@ -268,4 +268,26 @@ test_expect_success 'mailinfo warn CR in base64 encoded email' '
test_must_be_empty quoted-cr/0002.err 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 test_done

View file

@ -1,4 +1,4 @@
Author: A U Thor (this is (really) a comment (honestly)) Author: (this is (really) a "comment" (honestly)) A U Thor
Email: somebody@example.com Email: somebody@example.com
Subject: testing comments Subject: testing comments
Date: Sun, 25 May 2008 00:38:18 -0700 Date: Sun, 25 May 2008 00:38:18 -0700

View file

@ -1,5 +1,5 @@
From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001 From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
From: "A U Thor" <somebody@example.com> (this is \(really\) a comment (honestly)) From: (this is \(really\) a "comment" (honestly)) "A U Thor" <somebody@example.com>
Date: Sun, 25 May 2008 00:38:18 -0700 Date: Sun, 25 May 2008 00:38:18 -0700
Subject: [PATCH] testing comments Subject: [PATCH] testing comments