commit:     f2c8978599e4d0d42ec684d7263f53baf1db053b
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Thu Jan 29 16:47:22 2026 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Thu Jan 29 16:47:22 2026 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=f2c89785

libq/dep: fix some allocation/free stupidities

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 libq/dep.c | 32 ++++++++++++--------------------
 qdepends.c |  2 +-
 2 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/libq/dep.c b/libq/dep.c
index 2df3ec53..91cb4929 100644
--- a/libq/dep.c
+++ b/libq/dep.c
@@ -58,19 +58,6 @@ struct dep_node_ {
   bool              atom_resolved:1;
 };
 
-static void dep_burn_node
-(
-  dep_node_t *node
-)
-{
-  if (node == NULL)
-    return;
-
-  if (node->atom)
-    atom_implode(node->atom);
-  free(node);
-}
-
 dep_node_t *dep_grow_tree
 (
   const char *depend
@@ -208,7 +195,7 @@ dep_node_t *dep_grow_tree
       if (ret->parent == NULL)
       {
         warnf("Internal error, missing node for level %d", level);
-        dep_burn_node(ret);
+        dep_burn_tree(ret);
         ret = NULL;
         goto dep_grow_tree_fail;
       }
@@ -251,7 +238,7 @@ dep_node_t *dep_grow_tree
       if (ret->parent == NULL)
       {
         warnf("Internal error, missing node for level %d", level);
-        dep_burn_node(ret);
+        dep_burn_tree(ret);
         ret = NULL;
         goto dep_grow_tree_fail;
       }
@@ -318,7 +305,7 @@ dep_node_t *dep_grow_tree
           if (ret->parent == NULL)
           {
             warnf("Internal error, missing node for level %d", level);
-            dep_burn_node(ret);
+            dep_burn_tree(ret);
             ret = NULL;
             goto dep_grow_tree_fail;
           }
@@ -344,7 +331,7 @@ dep_node_t *dep_grow_tree
         if (ret->parent == NULL)
         {
           warnf("Internal error, missing node for level %d", level);
-          dep_burn_node(ret);
+          dep_burn_tree(ret);
           ret = NULL;
           goto dep_grow_tree_fail;
         }
@@ -370,13 +357,14 @@ dep_node_t *dep_grow_tree
   }
 #endif
 
-  ret = array_get(res, 0);  /* pseudo top-level again */
+  ret = array_remove(res, 0);  /* pseudo top-level again */
 
 dep_grow_tree_fail:
-  array_deepfree(tokens, (array_free_cb *)dep_burn_node);
+  array_deepfree(tokens, (array_free_cb *)dep_burn_tree);
   array_deepfree(res, (array_free_cb *)array_free);
 
   if (ret != NULL &&
+      ret->members != NULL &&
       array_cnt(ret->members) == 0)
     ret->type = DEP_NULL;
 
@@ -524,7 +512,11 @@ void dep_burn_tree
 
   if (root->members != NULL)
     array_deepfree(root->members, (array_free_cb *)dep_burn_tree);
-  dep_burn_node(root);
+
+  if (root->atom)
+    atom_implode(root->atom);
+
+  free(root);
 }
 
 /* eliminate all DEP_USE nodes in the dep tree that do not match the set

diff --git a/qdepends.c b/qdepends.c
index 64467dfd..c4a5387f 100644
--- a/qdepends.c
+++ b/qdepends.c
@@ -294,7 +294,7 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                        }
                }
 
-               array_deepfree(deps, (array_free_cb *)atom_implode);
+               array_free(deps);
                dep_burn_tree(dep_tree);
        }
        if (verbose && ret == 1)

Reply via email to