add -p: fix memory leak
asan reports that the C version of `add -p` is not freeing all the memory it allocates. Fix this by introducing a function to clear `struct add_p_state` and use it instead of freeing individual members. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Phillip Wood committed
Sep 7, 2020 at 15:04 UTC
324efcf6b6d30d43b98e76c7beac90ecfb40d637
1 file changed
+16
-8
add-patch.c
+16
-8
@@ -266,6 +266,20 @@ struct add_p_state {
266
const char *revision;
267
};
268
269
+static void add_p_state_clear(struct add_p_state *s)
270
+{
271
+ size_t i;
272
+
273
+ strbuf_release(&s->answer);
274
+ strbuf_release(&s->buf);
275
+ strbuf_release(&s->plain);
276
+ strbuf_release(&s->colored);
277
+ for (i = 0; i < s->file_diff_nr; i++)
278
+ free(s->file_diff[i].hunk);
279
+ free(s->file_diff);
280
+ clear_add_i_state(&s->s);
281
+}
282
+
283
static void err(struct add_p_state *s, const char *fmt, ...)
284
{
285
va_list args;
@@ -1673,9 +1687,7 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
1687
repo_refresh_and_write_index(r, REFRESH_QUIET, 0, 1,
1688
NULL, NULL, NULL) < 0) ||
1689
parse_diff(&s, ps) < 0) {
1676
- strbuf_release(&s.plain);
1677
- strbuf_release(&s.colored);
1678
- clear_add_i_state(&s.s);
1690
+ add_p_state_clear(&s);
1691
return -1;
1692
}
1693
@@ -1690,10 +1702,6 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
1702
else if (binary_count == s.file_diff_nr)
1703
fprintf(stderr, _("Only binary files changed.\n"));
1704
1693
- strbuf_release(&s.answer);
1694
- strbuf_release(&s.buf);
1695
- strbuf_release(&s.plain);
1696
- strbuf_release(&s.colored);
1697
- clear_add_i_state(&s.s);
1705
+ add_p_state_clear(&s);
1706
return 0;
1707
}