merge-ort: fix two leaks when handling directory rename modifications

There are two leaks in `apply_directory_rename_modifications()`: - We do not release the `dirs_to_insert` string list. - We do not release some `conflict_info` we put into the `opt->priv->paths` string map. The former is trivial to fix. The latter is a bit less straight forward: the `util` pointer of the string map may sometimes point to data that has been allocated via `CALLOC()`, while at other times it may point to data that has been allocated via a `mem_pool`. It very much seems like an oversight that we didn't also allocate the conflict info in this code path via the memory pool, though. So let's fix that, which will also plug the memory leak for us. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Sep 5, 2024 at 12:09 UTC ed78f048ae369e9076689cca71ff99f2baa90cd2
2 files changed +4 -1
merge-ort.c
+3 -1
@@ -2710,7 +2710,7 @@ static void apply_directory_rename_modifications(struct merge_options *opt,
2710 struct conflict_info *dir_ci;
2711 char *cur_dir = dirs_to_insert.items[i].string;
2712
2713 - CALLOC_ARRAY(dir_ci, 1);
2713 + dir_ci = mem_pool_calloc(&opt->priv->pool, 1, sizeof(*dir_ci));
2714
2715 dir_ci->merged.directory_name = parent_name;
2716 len = strlen(parent_name);
@@ -2838,6 +2838,8 @@ static void apply_directory_rename_modifications(struct merge_options *opt,
2838 * Finally, record the new location.
2839 */
2840 pair->two->path = new_path;
2841 +
2842 + string_list_clear(&dirs_to_insert, 0);
2843 }
2844
2845 /*** Function Grouping: functions related to regular rename detection ***/
t/t6423-merge-rename-directories.sh
+1
@@ -25,6 +25,7 @@ test_description="recursive merge with directory renames"
25 # underscore notation is to differentiate different
26 # files that might be renamed into each other's paths.)
27
28 +TEST_PASSES_SANITIZE_LEAK=true
29 . ./test-lib.sh
30 . "$TEST_DIRECTORY"/lib-merge.sh
31