On Wed, Nov 06, 2024 at 04:11:16PM +0100, Patrick Steinhardt wrote: > 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@xxxxxx> > --- > builtin/branch.c | 33 ++++++++++++++++++++++----------- > 1 file changed, 22 insertions(+), 11 deletions(-) > > diff --git a/builtin/branch.c b/builtin/branch.c > index fd1611ebf55..05ba4cd7a64 100644 > --- a/builtin/branch.c > +++ b/builtin/branch.c > @@ -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 */ Now we 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; ... here. OK. > + } > > 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; > } > -- > 2.47.0.229.g8f8d6eee53.dirty >