]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/describe: fix leaking array when running diff-index
authorPatrick Steinhardt <ps@pks.im>
Thu, 1 Aug 2024 10:38:25 +0000 (12:38 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Aug 2024 15:47:35 +0000 (08:47 -0700)
When running git-describe(1) with `--dirty`, we will set up a `struct
rev_info` with arguments for git-diff-index(1). The way we assemble the
arguments it causes two memory leaks though:

  - We never release the `struct strvec`.

  - `setup_revisions()` may end up removing some entries from the
    `strvec`, which we wouldn't free even if we released the struct.

While we could plug those leaks, this is ultimately unnecessary as the
arguments we pass are part of a static array anyway. So instead,
refactor the code to drop the `struct strvec` and just pass this static
array directly.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/describe.c

index 739878db85bc29a81db63f7bb29983cd380cf850..2957ff70315d098d159fc89ad57bb645edbf03e0 100644 (file)
@@ -695,7 +695,6 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                } else if (dirty) {
                        struct lock_file index_lock = LOCK_INIT;
                        struct rev_info revs;
-                       struct strvec args = STRVEC_INIT;
                        int fd;
 
                        setup_work_tree();
@@ -710,8 +709,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                                repo_update_index_if_able(the_repository, &index_lock);
 
                        repo_init_revisions(the_repository, &revs, prefix);
-                       strvec_pushv(&args, diff_index_args);
-                       if (setup_revisions(args.nr, args.v, &revs, NULL) != 1)
+
+                       if (setup_revisions(ARRAY_SIZE(diff_index_args) - 1,
+                                           diff_index_args, &revs, NULL) != 1)
                                BUG("malformed internal diff-index command line");
                        run_diff_index(&revs, 0);