]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule: fix leaking update strategy
authorPatrick Steinhardt <ps@pks.im>
Thu, 26 Sep 2024 11:46:08 +0000 (13:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 27 Sep 2024 15:25:34 +0000 (08:25 -0700)
We're not freeing the submodule update strategy command. Provide a
helper function that does this for us and call it in
`update_data_release()`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/submodule--helper.c
submodule-config.c
submodule.c
submodule.h
t/t7406-submodule-update.sh

index bf8f9a40128811fcc98010165c4fe61ccec33e63..ed05dc51347b7f5eac4eba46bb6b7f8b83eb91da 100644 (file)
@@ -2021,6 +2021,7 @@ struct update_data {
 static void update_data_release(struct update_data *ud)
 {
        free(ud->displaypath);
+       submodule_update_strategy_release(&ud->update_strategy);
        module_list_release(&ud->list);
 }
 
index c8f2bb2bdd3ef201cc70cf9afd296a14c978c366..471637a725afd7fc5f1af451fd9230eaebaf0d6a 100644 (file)
@@ -95,7 +95,7 @@ static void free_one_config(struct submodule_entry *entry)
        free((void *) entry->config->branch);
        free((void *) entry->config->url);
        free((void *) entry->config->ignore);
-       free((void *) entry->config->update_strategy.command);
+       submodule_update_strategy_release(&entry->config->update_strategy);
        free(entry->config);
 }
 
index 97d0d47b561fa42a982f613e7bae7105b56d4fab..0e67984d7701c59e5f43fc4655ed398957cb1344 100644 (file)
@@ -424,6 +424,11 @@ int parse_submodule_update_strategy(const char *value,
        return 0;
 }
 
+void submodule_update_strategy_release(struct submodule_update_strategy *strategy)
+{
+       free((char *) strategy->command);
+}
+
 const char *submodule_update_type_to_string(enum submodule_update_type type)
 {
        switch (type) {
index b50d29eba4f13ad6a77befb65e95019f63f70d78..4deb1b5f84e71efddfa7c7f6cc95b3e61f9323e2 100644 (file)
@@ -41,6 +41,10 @@ struct submodule_update_strategy {
        .type = SM_UPDATE_UNSPECIFIED, \
 }
 
+int parse_submodule_update_strategy(const char *value,
+                                   struct submodule_update_strategy *dst);
+void submodule_update_strategy_release(struct submodule_update_strategy *strategy);
+
 int is_gitmodules_unmerged(struct index_state *istate);
 int is_writing_gitmodules_ok(void);
 int is_staging_gitmodules_ok(struct index_state *istate);
@@ -70,8 +74,6 @@ void die_in_unpopulated_submodule(struct index_state *istate,
 void die_path_inside_submodule(struct index_state *istate,
                               const struct pathspec *ps);
 enum submodule_update_type parse_submodule_update_type(const char *value);
-int parse_submodule_update_strategy(const char *value,
-                                   struct submodule_update_strategy *dst);
 const char *submodule_update_type_to_string(enum submodule_update_type type);
 void handle_ignore_submodules_arg(struct diff_options *, const char *);
 void show_submodule_diff_summary(struct diff_options *o, const char *path,
index 297c6c3b5cc4b8889941f81422c5544db0ac2243..0f0c86f9cb20cefb4c33ff01750a5d30790fbaf9 100755 (executable)
@@ -12,6 +12,7 @@ submodule and "git submodule update --rebase/--merge" does not detach the HEAD.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh