summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-05-30 08:35:06 +0200
committerPatrick Steinhardt <ps@pks.im>2018-05-30 10:35:12 +0200
commitb2a389c87019c729ffaf179a338236dd129b473c (patch)
treeaaf1ed7a77ba0caed87546babec0759fc1c93136 /tests
parent36ae5c9330cf2ba22c3c6075752605a712755b60 (diff)
downloadlibgit2-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.c26
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;