Re: [PATCH 19/26] builtin/branch: fix leaking sorting options
On Wed, Nov 06, 2024 at 04:11:16PM +0100, Patrick Steinhardt wrote:
Show 56 quoted lines
> 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>
> ---
> 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 ...
Show 19 quoted lines
>
> 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;Show 33 quoted lines
> + }
>
> 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
>