]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule--helper: fix obscure leak in module_add()
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Wed, 31 Aug 2022 23:14:19 +0000 (01:14 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 2 Sep 2022 16:18:13 +0000 (09:18 -0700)
Fix an obscure leak in module_add(), if the "git add" command we were
piping to failed we'd fail to strbuf_release(&sb). This fixes a leak
introduced in a6226fd772b (submodule--helper: convert the bulk of
cmd_add() to C, 2021-08-10).

In fixing it move to a "goto cleanup" pattern, and since we need to
introduce a "ret" variable to do that let's also get rid of the
intermediate "exit_code" variable. The initialization to "-1" in
a6226fd772b has always been redundant, we'd only use the "exit_code"
value after assigning the return value of pipe_command() to it.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Reviewed-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/submodule--helper.c

index 7e2ffd88691020bc3ecda760b958ec5ecb37681a..6435508d28aef6b92afa86d7e6c9a79d84807e38 100644 (file)
@@ -3293,6 +3293,8 @@ static int module_add(int argc, const char **argv, const char *prefix)
                N_("git submodule add [<options>] [--] <repository> [<path>]"),
                NULL
        };
+       struct strbuf sb = STRBUF_INIT;
+       int ret = 1;
 
        argc = parse_options(argc, argv, prefix, options, usage, 0);
 
@@ -3342,21 +3344,17 @@ static int module_add(int argc, const char **argv, const char *prefix)
        die_on_repo_without_commits(add_data.sm_path);
 
        if (!force) {
-               int exit_code = -1;
-               struct strbuf sb = STRBUF_INIT;
                struct child_process cp = CHILD_PROCESS_INIT;
 
                cp.git_cmd = 1;
                cp.no_stdout = 1;
                strvec_pushl(&cp.args, "add", "--dry-run", "--ignore-missing",
                             "--no-warn-embedded-repo", add_data.sm_path, NULL);
-               if ((exit_code = pipe_command(&cp, NULL, 0, NULL, 0, &sb, 0))) {
+               if ((ret = pipe_command(&cp, NULL, 0, NULL, 0, &sb, 0))) {
                        strbuf_complete_line(&sb);
                        fputs(sb.buf, stderr);
-                       free(add_data.sm_path);
-                       return exit_code;
+                       goto cleanup;
                }
-               strbuf_release(&sb);
        }
 
        if(!add_data.sm_name)
@@ -3371,15 +3369,17 @@ static int module_add(int argc, const char **argv, const char *prefix)
        add_data.progress = !!progress;
        add_data.dissociate = !!dissociate;
 
-       if (add_submodule(&add_data)) {
-               free(add_data.sm_path);
-               return 1;
-       }
+       if (add_submodule(&add_data))
+               goto cleanup;
        configure_added_submodule(&add_data);
+
+       ret = 0;
+cleanup:
        free(add_data.sm_path);
        free(to_free);
+       strbuf_release(&sb);
 
-       return 0;
+       return ret;
 }
 
 #define SUPPORT_SUPER_PREFIX (1<<0)