From 70a1a55321282d0aa1e7f13d327db21aa25d212a Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 26 Nov 2018 19:21:13 +0100
Subject: Fixed some memory leaks at exit.

---
 src/analysis/binary.c   | 21 +++++++-----------
 src/analysis/loaded.c   |  2 +-
 src/analysis/loading.c  |  4 ++--
 src/analysis/project.c  |  8 +++----
 src/analysis/type.c     |  3 +--
 src/analysis/variable.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/core/collections.c  | 25 ++++++++++++++++++++++
 src/core/collections.h  |  3 +++
 8 files changed, 101 insertions(+), 22 deletions(-)

diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index f03ad17..8946311 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -82,7 +82,6 @@ struct _GLoadedBinary
     GExeFormat *format;                     /* Format du binaire           */
     GArchProcessor *proc;                   /* Architecture du binaire     */
 
-
     GBufferCache *disass_cache;             /* Instructions lisibles       */
     //GCodeBuffer **dec_buffers;              /* Sources sous forme de texte */
     size_t decbuf_count;                    /* Taille des tableaux         */
@@ -308,18 +307,18 @@ static void g_loaded_binary_dispose(GLoadedBinary *binary)
 {
     BinaryView i;                           /* Boucle de parcours          */
 
-    if (binary->format != NULL)
-        g_object_unref(G_OBJECT(binary->format));
-
-    if (binary->proc != NULL)
-        g_object_unref(G_OBJECT(binary->proc));
+    g_clear_object(&binary->local);
+    g_clear_object(&binary->remote);
 
-    /* TODO... */
+    delete_collections_list(&binary->collections);
 
+    g_clear_object(&binary->format);
+    g_clear_object(&binary->proc);
 
+    g_clear_object(&binary->disass_cache);
 
     for (i = 0; i < BVW_COUNT; i++)
-        g_object_unref(G_OBJECT(binary->options[i]));
+        g_clear_object(&binary->options[i]);
 
     G_OBJECT_CLASS(g_loaded_binary_parent_class)->dispose(G_OBJECT(binary));
 
@@ -342,7 +341,7 @@ static void g_loaded_binary_finalize(GLoadedBinary *binary)
 {
     free(binary->username);
 
-    /* TODO... */
+    free(binary->remote_host);
 
     G_OBJECT_CLASS(g_loaded_binary_parent_class)->finalize(G_OBJECT(binary));
 
@@ -1063,15 +1062,11 @@ GDbCollection *g_loaded_binary_find_collection(const GLoadedBinary *binary, DBFe
 {
     GDbCollection *result;                  /* Collection à retourner      */
 
-    /* TODO : lock */
-
     result = find_collection_in_list(binary->collections, feature);
 
     if (result != NULL)
         g_object_ref(G_OBJECT(result));
 
-    /* TODO : unlock */
-
     return result;
 
 }
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c
index 8c45ef4..d148366 100644
--- a/src/analysis/loaded.c
+++ b/src/analysis/loaded.c
@@ -615,7 +615,7 @@ static void g_loaded_analysis_init(GLoadedAnalysis *analysis)
 
 static void g_loaded_analysis_dispose(GLoadedAnalysis *analysis)
 {
-    g_object_unref(G_OBJECT(analysis->content));
+    g_clear_object(&analysis->content);
 
     G_OBJECT_CLASS(g_loaded_analysis_parent_class)->dispose(G_OBJECT(analysis));
 
diff --git a/src/analysis/loading.c b/src/analysis/loading.c
index 0afc60f..0ded268 100644
--- a/src/analysis/loading.c
+++ b/src/analysis/loading.c
@@ -356,7 +356,7 @@ static void g_exploring_work_init(GExploringWork *work)
 
 static void g_exploring_work_dispose(GExploringWork *work)
 {
-    g_object_unref(G_OBJECT(work->content));
+    g_clear_object(&work->content);
 
     G_OBJECT_CLASS(g_exploring_work_parent_class)->dispose(G_OBJECT(work));
 
@@ -1071,7 +1071,7 @@ static void g_resolving_work_init(GResolvingWork *work)
 
 static void g_resolving_work_dispose(GResolvingWork *work)
 {
-    g_object_unref(G_OBJECT(work->content));
+    g_clear_object(&work->content);
 
     G_OBJECT_CLASS(g_resolving_work_parent_class)->dispose(G_OBJECT(work));
 
diff --git a/src/analysis/project.c b/src/analysis/project.c
index 4399fc4..e01a126 100644
--- a/src/analysis/project.c
+++ b/src/analysis/project.c
@@ -260,10 +260,7 @@ static void g_study_project_dispose(GStudyProject *project)
     g_study_project_lock_contents(project);
 
     for (i = 0; i < project->count; i++)
-        g_object_unref(G_OBJECT(project->contents[i]));
-
-    if (project->contents != NULL)
-        free(project->contents);
+        g_clear_object(&project->contents[i]);
 
     g_study_project_unlock_contents(project);
 
@@ -291,6 +288,9 @@ static void g_study_project_finalize(GStudyProject *project)
     if (project->filename != NULL)
         free(project->filename);
 
+    if (project->contents != NULL)
+        free(project->contents);
+
     G_OBJECT_CLASS(g_study_project_parent_class)->finalize(G_OBJECT(project));
 
 }
diff --git a/src/analysis/type.c b/src/analysis/type.c
index d0ab4f5..497ef5e 100644
--- a/src/analysis/type.c
+++ b/src/analysis/type.c
@@ -109,8 +109,7 @@ static void g_data_type_init(GDataType *type)
 
 static void g_data_type_dispose(GDataType *type)
 {
-    if (type->namespace != NULL)
-        g_object_unref(G_OBJECT(type->namespace));
+    g_clear_object(&type->namespace);
 
     G_OBJECT_CLASS(g_data_type_parent_class)->dispose(G_OBJECT(type));
 
diff --git a/src/analysis/variable.c b/src/analysis/variable.c
index 9fb2e81..a2a8275 100644
--- a/src/analysis/variable.c
+++ b/src/analysis/variable.c
@@ -63,6 +63,12 @@ static void g_binary_variable_class_init(GBinVariableClass *);
 /* Initialise l'instande d'une variable. */
 static void g_binary_variable_init(GBinVariable *);
 
+/* Supprime toutes les références externes. */
+static void g_binary_variable_dispose(GBinVariable *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_binary_variable_finalize(GBinVariable *);
+
 
 
 /* -------------------- BASE DE VARIABLES OU VARIABLES INCONNUES -------------------- */
@@ -117,6 +123,12 @@ G_DEFINE_TYPE(GBinVariable, g_binary_variable, G_TYPE_OBJECT);
 
 static void g_binary_variable_class_init(GBinVariableClass *klass)
 {
+    GObjectClass *object;                   /* Autre version de la classe  */
+
+    object = G_OBJECT_CLASS(klass);
+
+    object->dispose = (GObjectFinalizeFunc/* ! */)g_binary_variable_dispose;
+    object->finalize = (GObjectFinalizeFunc)g_binary_variable_finalize;
 
 }
 
@@ -141,6 +153,51 @@ static void g_binary_variable_init(GBinVariable *var)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : var = instance d'objet GLib à traiter.                       *
+*                                                                             *
+*  Description : Supprime toutes les références externes.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_variable_dispose(GBinVariable *var)
+{
+    g_clear_object(&var->type);
+
+    g_clear_object(&var->owner);
+
+    G_OBJECT_CLASS(g_binary_variable_parent_class)->dispose(G_OBJECT(var));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : var = instance d'objet GLib à traiter.                       *
+*                                                                             *
+*  Description : Procède à la libération totale de la mémoire.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_binary_variable_finalize(GBinVariable *var)
+{
+    if (var->name != NULL)
+        free(var->name);
+
+    G_OBJECT_CLASS(g_binary_variable_parent_class)->finalize(G_OBJECT(var));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : type = type de la variable à mettre en place.                *
 *                                                                             *
 *  Description : Crée une représentation de variable de type donné.           *
diff --git a/src/core/collections.c b/src/core/collections.c
index d045e5a..a047a15 100644
--- a/src/core/collections.c
+++ b/src/core/collections.c
@@ -183,3 +183,28 @@ GList *create_collections_list(void)
     return result;
 
 }
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : collec = liste complète de collections à traiter. [OUT]      *
+*                                                                             *
+*  Description : Détruit un ensemble de collections.                          *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void delete_collections_list(GList **collec)
+{
+    if (*collec != NULL)
+    {
+        g_list_free_full(*collec, g_object_unref);
+
+        *collec = NULL;
+
+    }
+
+}
diff --git a/src/core/collections.h b/src/core/collections.h
index 1191f4c..d60125b 100644
--- a/src/core/collections.h
+++ b/src/core/collections.h
@@ -44,6 +44,9 @@ void unload_collection_definitions(void);
 /* Construit un nouvel ensemble de collections. */
 GList *create_collections_list(void);
 
+/* Détruit un ensemble de collections. */
+void delete_collections_list(GList **);
+
 
 
 #endif  /* _ANALYSIS_DB_COLLECTION_H */
-- 
cgit v0.11.2-87-g4458