summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Toso <victortoso@redhat.com>2022-02-15 10:25:22 +0100
committerVictor Toso <victortoso@redhat.com>2022-02-15 11:02:58 +0100
commit55f2d1112fc8065a27790fe33cc29e0304f780ee (patch)
tree81f716fb9b6773344549db4b02b76857f0c55cd9
parentc2c4fabfc609276558165d9388c23e4ff58ec584 (diff)
downloadlibosinfo-55f2d1112fc8065a27790fe33cc29e0304f780ee.tar.gz
loader: clear pointer before using it
osinfo_loader_nodeset() expects xmlNodePtr ** to be NULL and it will set it to NULL if not already set. This can lead to memory leaks as seen in previous commit. Let's clear the pointer instead and add a guard to clarify the parameter's expectations. Signed-off-by: Victor Toso <victortoso@redhat.com>
-rw-r--r--osinfo/osinfo_loader.c34
1 files changed, 14 insertions, 20 deletions
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index fa68334..0a9004a 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -213,8 +213,10 @@ osinfo_loader_nodeset(const char *xpath,
comp = osinfo_loader_get_comp_xpath(loader, xpath);
- if (list != NULL)
+ if (list != NULL) {
+ g_warn_if_fail(*list == NULL);
*list = NULL;
+ }
relnode = ctxt->node;
obj = xmlXPathCompiledEval(comp, ctxt);
@@ -280,7 +282,7 @@ osinfo_loader_boolean(const char *xpath,
GError **err)
{
- xmlNodePtr *nodes;
+ xmlNodePtr *nodes = NULL;
int count;
int i;
gboolean ret = FALSE;
@@ -1068,8 +1070,8 @@ static void osinfo_loader_install_script(OsinfoLoader *loader,
osinfo_install_script_set_avatar_format(installScript, avatar_format);
g_object_unref(avatar_format);
}
- g_free(nodes);
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./injection-method", loader, ctxt, &nodes,
err);
if (error_is_set(err))
@@ -1176,8 +1178,8 @@ static OsinfoMedia *osinfo_loader_media(OsinfoLoader *loader,
variant_id);
xmlFree(variant_id);
}
- g_free(nodes);
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./iso/*", loader, ctxt, &nodes, err);
if (error_is_set(err)) {
g_object_unref(media);
@@ -1228,8 +1230,7 @@ static OsinfoMedia *osinfo_loader_media(OsinfoLoader *loader,
}
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./installer/script", loader, ctxt, &nodes,
err);
if (error_is_set(err)) {
@@ -1294,10 +1295,10 @@ static OsinfoTree *osinfo_loader_tree(OsinfoLoader *loader,
variant_id);
xmlFree(variant_id);
}
- g_free(nodes);
osinfo_loader_entity(loader, OSINFO_ENTITY(tree), keys, ctxt, root, err);
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./treeinfo/*", loader, ctxt, &nodes, err);
if (error_is_set(err)) {
g_object_unref(G_OBJECT(tree));
@@ -1701,8 +1702,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
g_object_unref(media);
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./tree", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;
@@ -1724,8 +1724,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
g_object_unref(G_OBJECT(tree));
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./image", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;
@@ -1747,8 +1746,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
g_object_unref(G_OBJECT(image));
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./variant", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;
@@ -1769,8 +1767,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
g_object_unref(G_OBJECT(variant));
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./resources", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;
@@ -1791,9 +1788,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
ctxt->node = saved;
}
- g_free(nodes);
-
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./installer/script", loader, ctxt, &nodes,
err);
if (error_is_set(err))
@@ -1812,8 +1807,7 @@ static void osinfo_loader_os(OsinfoLoader *loader,
osinfo_os_add_install_script(os, script);
}
- g_free(nodes);
-
+ g_clear_pointer(&nodes, g_free);
nnodes = osinfo_loader_nodeset("./driver", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;