diff options
author | Patrick Steinhardt <ps@pks.im> | 2018-05-30 08:35:06 +0200 |
---|---|---|
committer | Patrick Steinhardt <ps@pks.im> | 2018-05-30 10:35:12 +0200 |
commit | b2a389c87019c729ffaf179a338236dd129b473c (patch) | |
tree | aaf1ed7a77ba0caed87546babec0759fc1c93136 /tests | |
parent | 36ae5c9330cf2ba22c3c6075752605a712755b60 (diff) | |
download | libgit2-b2a389c87019c729ffaf179a338236dd129b473c.tar.gz |
submodule: detect duplicated submodule paths
When loading submodule names, we build a map of submodule paths and
their respective names. While looping over the configuration keys,
we do not check though whether a submodule path was seen already. This
leads to a memory leak in case we have multiple submodules with the same
path, as we just overwrite the old value in the map in that case.
Fix the error by verifying that the path to be added is not yet part of
the string map. Git does not allow to have multiple submodules for a
path anyway, so we now do the same and detect this duplication,
reporting it to the user.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/submodule/lookup.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/tests/submodule/lookup.c b/tests/submodule/lookup.c index 170be5a44..5db5c2dd6 100644 --- a/tests/submodule/lookup.c +++ b/tests/submodule/lookup.c @@ -132,6 +132,32 @@ void test_submodule_lookup__foreach(void) cl_assert_equal_i(8, data.count); } +static int sm_dummy_cb(git_submodule *sm, const char *name, void *payload) +{ + GIT_UNUSED(sm); + GIT_UNUSED(name); + GIT_UNUSED(payload); + return 0; +} + +void test_submodule_lookup__duplicated_path(void) +{ + /* + * Manually invoke cleanup methods to remove leftovers + * from `setup_fixture_submod2` + */ + cl_git_sandbox_cleanup(); + cl_fixture_cleanup("submod2_target"); + + g_repo = setup_fixture_submodules(); + + /* + * This should fail, as the submodules repo has an + * invalid gitmodules file with duplicated paths. + */ + cl_git_fail(git_submodule_foreach(g_repo, sm_dummy_cb, NULL)); +} + void test_submodule_lookup__lookup_even_with_unborn_head(void) { git_reference *head; |