Am 28.12.22 um 19:00 schrieb Ævar Arnfjörð Bjarmason: > Fix a memory leak that's been with us ever since > 2f4038ab337 (Git-aware CGI to provide dumb HTTP transport, > 2009-10-30). In this case we're not calling regerror() after a failed > regexec(), and don't otherwise use "re" afterwards. > > We can therefore simplify this code by calling regfree() right after > the regexec(). An alternative fix would be to add a regfree() to both > the "return" and "break" path in this for-loop. Yes, or to add one regfree() call early in the conditional... > > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> > --- > http-backend.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/http-backend.c b/http-backend.c > index 6eb3b2fe51c..9bb63c458b1 100644 > --- a/http-backend.c > +++ b/http-backend.c > @@ -759,10 +759,14 @@ int cmd_main(int argc, const char **argv) > struct service_cmd *c = &services[i]; > regex_t re; > regmatch_t out[1]; > + int ret; > > if (regcomp(&re, c->pattern, REG_EXTENDED)) > die("Bogus regex in service table: %s", c->pattern); > - if (!regexec(&re, dir, 1, out, 0)) { > + ret = regexec(&re, dir, 1, out, 0); > + regfree(&re); > + > + if (!ret) { > size_t n; > ... i.e. right here. But only after copying the offsets out of "out"! Anyway, the ret approach taken here is fine. "dir" is still leaking, by the way. Probably worth a separate patch. > if (strcmp(method, c->method)) > @@ -774,7 +778,6 @@ int cmd_main(int argc, const char **argv) > dir[out[0].rm_so] = 0; > break; > } > - regfree(&re); > } > > if (!cmd)