Message ID | e0aa2c5bb258589bb2cac19c54fddbb70614a487.1730901926.git.ps@pks.im (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [01/26] builtin/blame: fix leaking blame entries with `--incremental` | expand |
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@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 ... > > 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 >
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 */ 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; }
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(-)