]> git.ipfire.org Git - thirdparty/git.git/commit
mailinfo: avoid recursion when unquoting From headers
authorJeff King <peff@peff.net>
Thu, 14 Dec 2023 21:48:59 +0000 (16:48 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 14 Dec 2023 22:33:52 +0000 (14:33 -0800)
commitdee182941fb685f5d85e61a0e9d97e8e91512f6c
tree6703ed7de2a3eb187fc8ea16bbd74bdbaf779dc1
parent2d9396c2feac8b707b367c64cd59604d7bc86a33
mailinfo: avoid recursion when unquoting From headers

Our unquote_comment() function is recursive; when it sees a comment
within a comment, like:

  (this is an (embedded) comment)

it recurses to handle the inner comment. This is fine for practical use,
but it does mean that you can easily run out of stack space with a
malicious header. For example:

  perl -e 'print "From: ", "(" x 2**18;' |
  git mailinfo /dev/null /dev/null

segfaults on my system. And since mailinfo is likely to be fed untrusted
input from the Internet (if not by human users, who might recognize a
garbage header, but certainly there are automated systems that apply
patches from a list) it may be possible for an attacker to trigger the
problem.

That said, I don't think there's an interesting security vulnerability
here. All an attacker can do is make it impossible to parse their email
and apply their patch, and there are lots of ways to generate bogus
emails. So it's more of an annoyance than anything.

But it's pretty easy to fix it. The recursion is not helping us preserve
any particular state from each level. The only flag in our parsing is
take_next_literally, and we can never recurse when it is set (since the
start of a new comment implies it was not backslash-escaped). So it is
really only useful for finding the end of the matched pair of
parentheses. We can do that easily with a simple depth counter.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
mailinfo.c