submodule-config: fix leaking name entry when traversing submodules

We traverse through submodules in the tree via `tree_entry()`, passing
to it a `struct name_entry` that it is supposed to populate with the
tree entry's contents. We unnecessarily allocate this variable instead
of passing a variable that is allocated on the stack, and the ultimately
don't even free that variable. This is unnecessary and leaks memory.

Convert the variable to instead be allocated on the stack to plug the
memory leak.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2024-08-14 08:52:12 +02:00
committed by Junio C Hamano
parent d1c53f6703
commit 5f6519b62c

View File

@@ -899,27 +899,25 @@ static void traverse_tree_submodules(struct repository *r,
{ {
struct tree_desc tree; struct tree_desc tree;
struct submodule_tree_entry *st_entry; struct submodule_tree_entry *st_entry;
struct name_entry *name_entry; struct name_entry name_entry;
char *tree_path = NULL; char *tree_path = NULL;
name_entry = xmalloc(sizeof(*name_entry));
fill_tree_descriptor(r, &tree, treeish_name); fill_tree_descriptor(r, &tree, treeish_name);
while (tree_entry(&tree, name_entry)) { while (tree_entry(&tree, &name_entry)) {
if (prefix) if (prefix)
tree_path = tree_path =
mkpathdup("%s/%s", prefix, name_entry->path); mkpathdup("%s/%s", prefix, name_entry.path);
else else
tree_path = xstrdup(name_entry->path); tree_path = xstrdup(name_entry.path);
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)) {
ALLOC_GROW(out->entries, out->entry_nr + 1, ALLOC_GROW(out->entries, out->entry_nr + 1,
out->entry_alloc); out->entry_alloc);
st_entry = &out->entries[out->entry_nr++]; 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 =
submodule_from_path(r, root_tree, tree_path); submodule_from_path(r, root_tree, tree_path);
st_entry->repo = xmalloc(sizeof(*st_entry->repo)); st_entry->repo = xmalloc(sizeof(*st_entry->repo));
@@ -927,9 +925,9 @@ static void traverse_tree_submodules(struct repository *r,
root_tree)) root_tree))
FREE_AND_NULL(st_entry->repo); FREE_AND_NULL(st_entry->repo);
} 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);
free(tree_path); free(tree_path);
} }
} }