aboutsummaryrefslogtreecommitdiffstats
path: root/builtin/annotate.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-10-10 14:22:27 -0700
committerJunio C Hamano <gitster@pobox.com>2024-10-10 14:22:29 -0700
commit31bc4454de66c22bc8570fd3af52a99843ac69b0 (patch)
tree605cb77cc73bdece2a856d2a34286aa4f2bb780c /builtin/annotate.c
parentMerge branch 'ds/line-log-asan-fix' (diff)
parentbuiltin/send-pack: fix leaking list of push options (diff)
downloadgit-31bc4454de66c22bc8570fd3af52a99843ac69b0.tar.gz
git-31bc4454de66c22bc8570fd3af52a99843ac69b0.zip
Merge branch 'ps/leakfixes-part-8'
More leakfixes. * ps/leakfixes-part-8: (23 commits) builtin/send-pack: fix leaking list of push options remote: fix leaking push reports t/helper: fix leaks in proc-receive helper pack-write: fix return parameter of `write_rev_file_order()` revision: fix leaking saved parents revision: fix memory leaks when rewriting parents midx-write: fix leaking buffer pack-bitmap-write: fix leaking OID array pseudo-merge: fix leaking strmap keys pseudo-merge: fix various memory leaks line-log: fix several memory leaks diff: improve lifecycle management of diff queues builtin/revert: fix leaking `gpg_sign` and `strategy` config t/helper: fix leaking repository in partial-clone helper builtin/clone: fix leaking repo state when cloning with bundle URIs builtin/pack-redundant: fix various memory leaks builtin/stash: fix leaking `pathspec_from_file` submodule: fix leaking submodule entry list wt-status: fix leaking buffer with sparse directories shell: fix leaking strings ...
Diffstat (limited to 'builtin/annotate.c')
-rw-r--r--builtin/annotate.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/builtin/annotate.c b/builtin/annotate.c
index a99179fe4d..03413c7df8 100644
--- a/builtin/annotate.c
+++ b/builtin/annotate.c
@@ -15,13 +15,23 @@ int cmd_annotate(int argc,
struct repository *repo UNUSED)
{
struct strvec args = STRVEC_INIT;
- int i;
+ const char **args_copy;
+ int ret;
strvec_pushl(&args, "annotate", "-c", NULL);
-
- for (i = 1; i < argc; i++) {
+ for (int i = 1; i < argc; i++)
strvec_push(&args, argv[i]);
- }
- return cmd_blame(args.nr, args.v, prefix, the_repository);
+ /*
+ * `cmd_blame()` ends up modifying the array, which causes memory leaks
+ * if we didn't copy the array here.
+ */
+ CALLOC_ARRAY(args_copy, args.nr + 1);
+ COPY_ARRAY(args_copy, args.v, args.nr);
+
+ ret = cmd_blame(args.nr, args_copy, prefix, the_repository);
+
+ strvec_clear(&args);
+ free(args_copy);
+ return ret;
}