opkg: (leak fixing, day 2) lots and lots of memory leaks fixed
[oweals/opkg-lede.git] / libopkg / pkg.c
index d9bae898ec3d8b192b0451f410c687ba8a247f36..6793c826ee0188fc5bc8df7f625142d9cb888828 100644 (file)
@@ -142,6 +142,19 @@ int pkg_init(pkg_t *pkg)
      return 0;
 }
 
+void compound_depend_deinit (compound_depend_t *depends)
+{
+    int i;
+    for (i = 0; i < depends->possibility_count; i++)
+    {
+        depend_t *d;
+        d = depends->possibilities[i];
+        free (d->version);
+        free (d);
+    }
+    free (depends->possibilities);
+}
+
 void pkg_deinit(pkg_t *pkg)
 {
      int i;
@@ -171,35 +184,39 @@ void pkg_deinit(pkg_t *pkg)
      pkg->state_flag = SF_OK;
      pkg->state_status = SS_NOT_INSTALLED;
 
+     //for (i = 0; i < pkg->replaces_count; i++)
+     free (pkg->replaces);
+     pkg->replaces = NULL;
+
      for (i = 0; i < pkg->depends_count; i++)
        free (pkg->depends_str[i]);
      free(pkg->depends_str);
      pkg->depends_str = NULL;
-     pkg->depends_count = 0;
 
      for (i = 0; i < pkg->provides_count; i++)
        free (pkg->provides_str[i]);
      free(pkg->provides_str);
      pkg->provides_str = NULL;
-     pkg->provides_count = 0;
 
      for (i = 0; i < pkg->conflicts_count; i++)
        free (pkg->conflicts_str[i]);
      free(pkg->conflicts_str);
      pkg->conflicts_str = NULL;
-     pkg->conflicts_count = 0;
 
      for (i = 0; i < pkg->replaces_count; i++)
        free (pkg->replaces_str[i]);
      free(pkg->replaces_str);
      pkg->replaces_str = NULL;
-     pkg->replaces_count = 0;
 
      for (i = 0; i < pkg->recommends_count; i++)
        free (pkg->recommends_str[i]);
      free(pkg->recommends_str);
      pkg->recommends_str = NULL;
-     pkg->recommends_count = 0;
+
+     for (i = 0; i < pkg->suggests_count; i++)
+       free (pkg->suggests_str[i]);
+     free(pkg->suggests_str);
+     pkg->suggests_str = NULL;
 
      if (pkg->depends)
      {
@@ -207,23 +224,19 @@ void pkg_deinit(pkg_t *pkg)
        int x;
 
        for (x = 0; x < count; x++)
-       {
-         compound_depend_t *depends;
-        depends = &pkg->depends[x];
-
-         for (i = 0; i < depends->possibility_count; i++)
-         {
-           depend_t *d;
-           d = depends->possibilities[i];
-           free (d->version);
-           free (d);
-        }
-        free (depends->possibilities);
-       }
+        compound_depend_deinit (&pkg->depends[x]);
        free (pkg->depends);
      }
+
+     if (pkg->conflicts)
+     {
+       int x;
+       for (x = 0; x < pkg->conflicts_count; x++)
+         compound_depend_deinit (&pkg->conflicts[x]);
+       free (pkg->conflicts);
+     }
+
      free (pkg->provides);
-     free (pkg->conflicts);
 
      pkg->pre_depends_count = 0;
      free(pkg->pre_depends_str);
@@ -1398,6 +1411,7 @@ int pkg_free_installed_files(pkg_t *pkg)
          }
 
          str_list_deinit(pkg->installed_files);
+         free (pkg->installed_files);
      }
 
      pkg->installed_files = NULL;
@@ -1800,5 +1814,6 @@ int pkg_write_changed_filelists(opkg_conf_t *conf)
                    opkg_message(conf, OPKG_NOTICE, "pkg_write_filelist pkg=%s returned %d\n", pkg->name, err);
          }
      }
+     pkg_vec_free (installed_pkgs);
      return 0;
 }