]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/branch: fix leaking sorting options
authorPatrick Steinhardt <ps@pks.im>
Wed, 20 Nov 2024 13:39:48 +0000 (14:39 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Nov 2024 23:23:45 +0000 (08:23 +0900)
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>
builtin/branch.c

index fd1611ebf559f7665114c41ee379db24fdb357fd..05ba4cd7a6454d8753d983082807a06dd989cb48 100644 (file)
@@ -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;
 }