Skip to content

Commit 17154b1

Browse files
Martin Ågrengitster
authored andcommitted
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 <[email protected]> Signed-off-byi Martin Ågren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 468165c commit 17154b1

File tree

2 files changed

+0
-3
lines changed

2 files changed

+0
-3
lines changed

diffcore-pickaxe.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ static void regcomp_or_die(regex_t *regex, const char *needle, int cflags)
215215
/* The POSIX.2 people are surely sick */
216216
char errbuf[1024];
217217
regerror(err, regex, errbuf, 1024);
218-
regfree(regex);
219218
die("invalid regex: %s", errbuf);
220219
}
221220
}

grep.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,6 @@ static void compile_fixed_regexp(struct grep_pat *p, struct grep_opt *opt)
636636
if (err) {
637637
char errbuf[1024];
638638
regerror(err, &p->regexp, errbuf, sizeof(errbuf));
639-
regfree(&p->regexp);
640639
compile_regexp_failed(p, errbuf);
641640
}
642641
}
@@ -701,7 +700,6 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
701700
if (err) {
702701
char errbuf[1024];
703702
regerror(err, &p->regexp, errbuf, 1024);
704-
regfree(&p->regexp);
705703
compile_regexp_failed(p, errbuf);
706704
}
707705
}

0 commit comments

Comments
 (0)