From 70a1a55321282d0aa1e7f13d327db21aa25d212a Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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