regex: do not call `regfree()` if compilation fails
commit17154b1576f8be5aa3044f3adadb5473da618a42
authorMartin Ågren <martin.agren@gmail.com>
Sun, 20 May 2018 10:50:32 +0000 (20 12:50 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 May 2018 04:58:32 +0000 (21 13:58 +0900)
tree38f1785f400756a59acc50c78755f78ef1be0a89
parent468165c1d8a442994a825f3684528361727cd8c0
regex: do not call `regfree()` if compilation fails

It is apparently undefined behavior to call `regfree()` on a regex where
`regcomp()` failed. The language in [1] is a bit muddy, at least to me,
but the clearest hint is this (`preg` is the `regex_t *`):

    Upon successful completion, the regcomp() function shall return 0.
    Otherwise, it shall return an integer value indicating an error as
    described in <regex.h>, and the content of preg is undefined.

Funnily enough, there is also the `regerror()` function which should be
given a pointer to such a "failed" `regex_t` -- the content of which
would supposedly be undefined -- and which may investigate it to come up
with a detailed error message.

In any case, the example in that document shows how `regfree()` is not
called after `regcomp()` fails.

We have quite a few users of this API and most get this right. These
three users do not.

Several implementations can handle this just fine [2] and these code paths
supposedly have not wreaked havoc or we'd have heard about it. (These
are all in code paths where git got bad input and is just about to die
anyway.) But let's just avoid the issue altogether.

[1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/regcomp.html

[2] https://www.redhat.com/archives/libvir-list/2013-September/msg00262.html

Researched-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-byi Martin Ågren <martin.agren@gmail.com>

Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-pickaxe.c
grep.c