]> git.ipfire.org Git - thirdparty/git.git/commitdiff
worktree: fix leak in check_clean_worktree()
authorJeff King <peff@peff.net>
Thu, 27 Aug 2020 05:25:04 +0000 (01:25 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 27 Aug 2020 15:30:17 +0000 (08:30 -0700)
We allocate a child_env strvec but never free its memory. Instead, let's
just use the strvec that our child_process struct provides, which is
cleaned up automatically when we run the command.

And while we're moving the initialization of the child_process around,
let's switch it to use the official init function (zero-initializing it
works OK, since strvec is happy enough with that, but it sets a bad
example).

Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c

index f0cbdef718215d1ff71a2a71204c10d296a9b2c8..8bfb79f3a5febca79a81eb41c407b7e173c766ba 100644 (file)
@@ -924,7 +924,6 @@ static int move_worktree(int ac, const char **av, const char *prefix)
 static void check_clean_worktree(struct worktree *wt,
                                 const char *original_path)
 {
-       struct argv_array child_env = ARGV_ARRAY_INIT;
        struct child_process cp;
        char buf[1];
        int ret;
@@ -935,15 +934,14 @@ static void check_clean_worktree(struct worktree *wt,
         */
        validate_no_submodules(wt);
 
-       argv_array_pushf(&child_env, "%s=%s/.git",
+       child_process_init(&cp);
+       argv_array_pushf(&cp.env_array, "%s=%s/.git",
                         GIT_DIR_ENVIRONMENT, wt->path);
-       argv_array_pushf(&child_env, "%s=%s",
+       argv_array_pushf(&cp.env_array, "%s=%s",
                         GIT_WORK_TREE_ENVIRONMENT, wt->path);
-       memset(&cp, 0, sizeof(cp));
        argv_array_pushl(&cp.args, "status",
                         "--porcelain", "--ignore-submodules=none",
                         NULL);
-       cp.env = child_env.argv;
        cp.git_cmd = 1;
        cp.dir = wt->path;
        cp.out = -1;