On Fri, Jul 26, 2024 at 02:15:09PM +0200, Patrick Steinhardt wrote: > There are multiple trivial memory leaks in the submodule helper. Fix > those. > > Signed-off-by: Patrick Steinhardt <ps@xxxxxx> Hi Patrick, While working on another series, I fixed some leaks. But, I haven't sent any patches. The series this message belongs to fixes all the leaks that my unsent series addresses. So, I won't bother sending my patches. However, I think we can do better for the second leak solved in this patch. I leave my patch at the end of this message in case you want to take a look. In any case, thanks for working on this. I have the habit of having "SANITIZE=leak" in my config.mak, so this series will make me have fewer distractions :) > --- > builtin/submodule--helper.c | 13 ++++++++++--- > t/t7400-submodule-basic.sh | 1 + > 2 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c > index f1218a1995..5ae06c3e0b 100644 > --- a/builtin/submodule--helper.c > +++ b/builtin/submodule--helper.c > @@ -2269,6 +2269,7 @@ static int is_tip_reachable(const char *path, const struct object_id *oid) > struct child_process cp = CHILD_PROCESS_INIT; > struct strbuf rev = STRBUF_INIT; > char *hex = oid_to_hex(oid); > + int reachable; > > cp.git_cmd = 1; > cp.dir = path; > @@ -2278,9 +2279,12 @@ static int is_tip_reachable(const char *path, const struct object_id *oid) > prepare_submodule_repo_env(&cp.env); > > if (capture_command(&cp, &rev, GIT_MAX_HEXSZ + 1) || rev.len) > - return 0; > + reachable = 0; > + else > + reachable = 1; > > - return 1; > + strbuf_release(&rev); > + return reachable; > } > > static int fetch_in_submodule(const char *module_path, int depth, int quiet, > @@ -3135,6 +3139,7 @@ static void append_fetch_remotes(struct strbuf *msg, const char *git_dir_path) > static int add_submodule(const struct add_data *add_data) > { > char *submod_gitdir_path; > + char *depth_to_free = NULL; > struct module_clone_data clone_data = MODULE_CLONE_DATA_INIT; > struct string_list reference = STRING_LIST_INIT_NODUP; > int ret = -1; > @@ -3200,7 +3205,7 @@ static int add_submodule(const struct add_data *add_data) > } > clone_data.dissociate = add_data->dissociate; > if (add_data->depth >= 0) > - clone_data.depth = xstrfmt("%d", add_data->depth); > + clone_data.depth = depth_to_free = xstrfmt("%d", add_data->depth); > > if (clone_submodule(&clone_data, &reference)) > goto cleanup; > @@ -3223,7 +3228,9 @@ static int add_submodule(const struct add_data *add_data) > die(_("unable to checkout submodule '%s'"), add_data->sm_path); > } > ret = 0; > + > cleanup: > + free(depth_to_free); > string_list_clear(&reference, 1); > return ret; > } > diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh > index 981488885f..098d8833b6 100755 > --- a/t/t7400-submodule-basic.sh > +++ b/t/t7400-submodule-basic.sh > @@ -12,6 +12,7 @@ subcommands of git submodule. > GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main > export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME > > +TEST_PASSES_SANITIZE_LEAK=true > . ./test-lib.sh > > test_expect_success 'setup - enable local submodules' ' > -- > 2.46.0.rc1.dirty > ----- >8 --------- >8 --------- >8 --------- >8 ----- Subject: [PATCH] submodule--helper: depth clone parameter The `clone` subcommand has an OPT_STRING parameter: `--depth`, that eventually is used when invoking `git-clone`. As `git-clone` only support positive integer values for `--depth` since 5594bcad21 (clone,fetch: catch non positive `--depth` option value, 2013-12-05), seems safe to change the `--depth` parameter to OPT_INTEGER in `module_clone`. Doing so we avoid a leak in `add_submodule`. Do it. Signed-off-by: Rubén Justo <rjusto@xxxxxxxxx> --- builtin/submodule--helper.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index f1218a1995..e7d52f38d9 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -1530,7 +1530,7 @@ struct module_clone_data { const char *path; const char *name; const char *url; - const char *depth; + int depth; struct list_objects_filter_options *filter_options; unsigned int quiet: 1; unsigned int progress: 1; @@ -1729,8 +1729,8 @@ static int clone_submodule(const struct module_clone_data *clone_data, strvec_push(&cp.args, "--quiet"); if (clone_data->progress) strvec_push(&cp.args, "--progress"); - if (clone_data->depth && *(clone_data->depth)) - strvec_pushl(&cp.args, "--depth", clone_data->depth, NULL); + if (clone_data->depth > 0) + strvec_pushf(&cp.args, "--depth=%d", clone_data->depth); if (reference->nr) { struct string_list_item *item; @@ -1851,8 +1851,7 @@ static int module_clone(int argc, const char **argv, const char *prefix) N_("reference repository")), OPT_BOOL(0, "dissociate", &dissociate, N_("use --reference only while cloning")), - OPT_STRING(0, "depth", &clone_data.depth, - N_("string"), + OPT_INTEGER(0, "depth", &clone_data.depth, N_("depth for shallow clones")), OPT__QUIET(&quiet, "suppress output for cloning a submodule"), OPT_BOOL(0, "progress", &progress, @@ -3199,8 +3198,7 @@ static int add_submodule(const struct add_data *add_data) string_list_append(&reference, p)->util = p; } clone_data.dissociate = add_data->dissociate; - if (add_data->depth >= 0) - clone_data.depth = xstrfmt("%d", add_data->depth); + clone_data.depth = add_data->depth; if (clone_submodule(&clone_data, &reference)) goto cleanup; -- 2.45.1