submodule-config: avoid memory leak

In 961b130d20 (branch: add --recurse-submodules option for branch
creation, 2022-01-28), a funny pattern was introduced where first some
struct is `xmalloc()`ed, then we resize an array whose element type is
the same struct, and then the first struct's contents are copied into
the last element of that array.

Crucially, the `xmalloc()`ed memory never gets released.

Let's avoid that memory leak and that memory allocation dance altogether
by first reallocating the array, then using a pointer to the last array
element to go forward.

Reported by Coverity.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2022-06-15 23:35:39 +00:00 committed by Junio C Hamano
parent 5a09991e32
commit f53559227c

View File

@ -756,7 +756,10 @@ static void traverse_tree_submodules(struct repository *r,
if (S_ISGITLINK(name_entry->mode) && if (S_ISGITLINK(name_entry->mode) &&
is_tree_submodule_active(r, root_tree, tree_path)) { is_tree_submodule_active(r, root_tree, tree_path)) {
st_entry = xmalloc(sizeof(*st_entry)); ALLOC_GROW(out->entries, out->entry_nr + 1,
out->entry_alloc);
st_entry = &out->entries[out->entry_nr++];
st_entry->name_entry = xmalloc(sizeof(*st_entry->name_entry)); st_entry->name_entry = xmalloc(sizeof(*st_entry->name_entry));
*st_entry->name_entry = *name_entry; *st_entry->name_entry = *name_entry;
st_entry->submodule = st_entry->submodule =
@ -766,9 +769,6 @@ static void traverse_tree_submodules(struct repository *r,
root_tree)) root_tree))
FREE_AND_NULL(st_entry->repo); FREE_AND_NULL(st_entry->repo);
ALLOC_GROW(out->entries, out->entry_nr + 1,
out->entry_alloc);
out->entries[out->entry_nr++] = *st_entry;
} else if (S_ISDIR(name_entry->mode)) } else if (S_ISDIR(name_entry->mode))
traverse_tree_submodules(r, root_tree, tree_path, traverse_tree_submodules(r, root_tree, tree_path,
&name_entry->oid, out); &name_entry->oid, out);