range-diff: plug memory leak in read_patches()
Amend code added in d9c66f0b5b
(range-diff: first rudimentary
implementation, 2018-08-13) to use a "goto cleanup" pattern. This
makes for less code, and frees memory that we'd previously leak.
The reason for changing free(util) to FREE_AND_NULL(util) is because
at the end of the function we append the contents of "util" to a
"struct string_list" if it's non-NULL.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4998e93fa6
commit
2d102c2bca
29
range-diff.c
29
range-diff.c
@ -40,6 +40,7 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
char *line, *current_filename = NULL;
|
||||
ssize_t len;
|
||||
size_t size;
|
||||
int ret = -1;
|
||||
|
||||
strvec_pushl(&cp.args, "log", "--no-color", "-p", "--no-merges",
|
||||
"--reverse", "--date-order", "--decorate=no",
|
||||
@ -68,10 +69,10 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
if (strbuf_read(&contents, cp.out, 0) < 0) {
|
||||
error_errno(_("could not read `log` output"));
|
||||
finish_command(&cp);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
if (finish_command(&cp))
|
||||
return -1;
|
||||
goto cleanup;
|
||||
|
||||
line = contents.buf;
|
||||
size = contents.len;
|
||||
@ -95,12 +96,9 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
CALLOC_ARRAY(util, 1);
|
||||
if (get_oid(p, &util->oid)) {
|
||||
error(_("could not parse commit '%s'"), p);
|
||||
free(util);
|
||||
free(current_filename);
|
||||
FREE_AND_NULL(util);
|
||||
string_list_clear(list, 1);
|
||||
strbuf_release(&buf);
|
||||
strbuf_release(&contents);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
util->matching = -1;
|
||||
in_header = 1;
|
||||
@ -111,11 +109,8 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
error(_("could not parse first line of `log` output: "
|
||||
"did not start with 'commit ': '%s'"),
|
||||
line);
|
||||
free(current_filename);
|
||||
string_list_clear(list, 1);
|
||||
strbuf_release(&buf);
|
||||
strbuf_release(&contents);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (starts_with(line, "diff --git")) {
|
||||
@ -136,12 +131,9 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
if (len < 0) {
|
||||
error(_("could not parse git header '%.*s'"),
|
||||
orig_len, line);
|
||||
free(util);
|
||||
free(current_filename);
|
||||
FREE_AND_NULL(util);
|
||||
string_list_clear(list, 1);
|
||||
strbuf_release(&buf);
|
||||
strbuf_release(&contents);
|
||||
return -1;
|
||||
goto cleanup;
|
||||
}
|
||||
strbuf_addstr(&buf, " ## ");
|
||||
if (patch.is_new > 0)
|
||||
@ -219,6 +211,9 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
strbuf_addch(&buf, '\n');
|
||||
util->diffsize++;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
strbuf_release(&contents);
|
||||
|
||||
if (util)
|
||||
@ -226,7 +221,7 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
strbuf_release(&buf);
|
||||
free(current_filename);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int patch_util_cmp(const void *dummy, const struct patch_util *a,
|
||||
|
Loading…
Reference in New Issue
Block a user