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:
parent
5a09991e32
commit
f53559227c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user