builtin/branch: fix leaking sorting options
The sorting options are leaking, but given that they are marked with `UNLEAK()` the leak sanitizer doesn't complain. Fix the leak by creating a common exit path and clearing the vector such that we can get rid of the `UNLEAK()` annotation entirely. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8ef15c205b
commit
b97301c13c
@ -722,6 +722,7 @@ int cmd_branch(int argc,
|
||||
static struct ref_sorting *sorting;
|
||||
struct string_list sorting_options = STRING_LIST_INIT_DUP;
|
||||
struct ref_format format = REF_FORMAT_INIT;
|
||||
int ret;
|
||||
|
||||
struct option options[] = {
|
||||
OPT_GROUP(N_("Generic options")),
|
||||
@ -851,15 +852,15 @@ int cmd_branch(int argc,
|
||||
if (list)
|
||||
setup_auto_pager("branch", 1);
|
||||
|
||||
UNLEAK(sorting_options);
|
||||
|
||||
if (delete) {
|
||||
if (!argc)
|
||||
die(_("branch name required"));
|
||||
return delete_branches(argc, argv, delete > 1, filter.kind, quiet);
|
||||
ret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);
|
||||
goto out;
|
||||
} else if (show_current) {
|
||||
print_current_branch_name();
|
||||
return 0;
|
||||
ret = 0;
|
||||
goto out;
|
||||
} else if (list) {
|
||||
/* git branch --list also shows HEAD when it is detached */
|
||||
if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
|
||||
@ -882,12 +883,13 @@ int cmd_branch(int argc,
|
||||
ref_sorting_release(sorting);
|
||||
ref_filter_clear(&filter);
|
||||
ref_format_clear(&format);
|
||||
return 0;
|
||||
|
||||
ret = 0;
|
||||
goto out;
|
||||
} else if (edit_description) {
|
||||
const char *branch_name;
|
||||
struct strbuf branch_ref = STRBUF_INIT;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
int ret = 1; /* assume failure */
|
||||
|
||||
if (!argc) {
|
||||
if (filter.detached)
|
||||
@ -901,18 +903,22 @@ int cmd_branch(int argc,
|
||||
}
|
||||
|
||||
strbuf_addf(&branch_ref, "refs/heads/%s", branch_name);
|
||||
if (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf))
|
||||
if (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf)) {
|
||||
error((!argc || branch_checked_out(branch_ref.buf))
|
||||
? _("no commit on branch '%s' yet")
|
||||
: _("no branch named '%s'"),
|
||||
branch_name);
|
||||
else if (!edit_branch_description(branch_name))
|
||||
ret = 1;
|
||||
} else if (!edit_branch_description(branch_name)) {
|
||||
ret = 0; /* happy */
|
||||
} else {
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
strbuf_release(&branch_ref);
|
||||
strbuf_release(&buf);
|
||||
|
||||
return ret;
|
||||
goto out;
|
||||
} else if (copy || rename) {
|
||||
if (!argc)
|
||||
die(_("branch name required"));
|
||||
@ -1000,12 +1006,17 @@ int cmd_branch(int argc,
|
||||
create_branches_recursively(the_repository, branch_name,
|
||||
start_name, NULL, force,
|
||||
reflog, quiet, track, 0);
|
||||
return 0;
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
create_branch(the_repository, branch_name, start_name, force, 0,
|
||||
reflog, quiet, track, 0);
|
||||
} else
|
||||
usage_with_options(builtin_branch_usage, options);
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
string_list_clear(&sorting_options, 0);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user