From 4a4fb0a694b0c6d567a6b5628c875827584d2cae Mon Sep 17 00:00:00 2001 From: Jaime Thomas Date: Tue, 9 Dec 2008 02:38:04 +0000 Subject: [PATCH] Fix memory leaks --- ecdb/trunk/src/ecdb_burn.c | 49 +++++++++++++++++++++++++++---------- ecdb/trunk/src/ecdb_image.c | 4 +-- ecdb/trunk/src/ecdb_misc.c | 4 +-- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/ecdb/trunk/src/ecdb_burn.c b/ecdb/trunk/src/ecdb_burn.c index 7f0f7fe..d25bcec 100644 --- a/ecdb/trunk/src/ecdb_burn.c +++ b/ecdb/trunk/src/ecdb_burn.c @@ -15,6 +15,9 @@ int ecdb_burn_project_init(Ecdb_Burn_Project *proj); int ecdb_erase_project_init(Ecdb_Erase_Project *proj); static void ecdb_burn_progress_handler(void *data, void *buffer, unsigned int nbyte); +void ecdb_sources_list_free(void *data); +void ecdb_tracks_list_free(void *data); + Ecdb_Burn_Project * ecdb_burn_project_new(void) @@ -89,6 +92,8 @@ ecdb_burn_project(Ecdb_Burn_Project *proj) data->proj = ECDB_PROJECT(proj); data->sources = ecore_list_new(); data->tracks = ecore_list_new(); + ecore_list_free_cb_set(data->sources, ecdb_sources_list_free); + ecore_list_free_cb_set(data->tracks, ecdb_tracks_list_free); if (proj->burn_mode != BURN_AUDIO) padding = 300*1024; @@ -104,6 +109,11 @@ ecdb_burn_project(Ecdb_Burn_Project *proj) if (!source) { printf("Failed to add any files to burn disc!\n"); + burn_session_free(data->session); + burn_disc_free(data->disc); + ecore_list_destroy(data->sources); + ecore_list_destroy(data->tracks); + FREE(data); return ECDB_ERROR_IMAGE_CREATE; } @@ -111,6 +121,11 @@ ecdb_burn_project(Ecdb_Burn_Project *proj) { printf("Error: Cannot attach source object to track " "object!\n"); + burn_session_free(data->session); + burn_disc_free(data->disc); + ecore_list_destroy(data->sources); + ecore_list_destroy(data->tracks); + FREE(data); return ECDB_ERROR_SOURCE_ATTACH; } @@ -135,6 +150,12 @@ ecdb_burn_project(Ecdb_Burn_Project *proj) { printf("Error: Failed to find a suitable write mode for " "disc!\n"); + burn_session_free(data->session); + burn_disc_free(data->disc); + burn_write_opts_free(opts); + ecore_list_destroy(data->sources); + ecore_list_destroy(data->tracks); + FREE(proj); return ECDB_ERROR_WRITE_MODE; } @@ -232,21 +253,10 @@ int ecdb_burn_finished(void *data, int type, void *event) { Burn_Data *proj; - BurnTrack *track; - BurnSource *source; proj = data; - ecore_list_first(proj->sources); - ecore_list_first(proj->tracks); - printf("Freeing source and tracks\n"); - while ((source = ecore_list_remove(proj->sources))) - { - burn_source_free(source); - track = ecore_list_remove(proj->tracks); - burn_track_free(track); - } ecore_list_destroy(proj->sources); ecore_list_destroy(proj->tracks); @@ -271,6 +281,19 @@ ecdb_burn_finished(void *data, int type, void *event) } FREE(proj); - /* To be removed from here at some point */ + ecdb_gui_burn_image_cleanup(); + return TRUE; -} +} + +void +ecdb_sources_list_free(void *data) +{ + burn_source_free(data); +} + +void +ecdb_tracks_list_free(void *data) +{ + burn_track_free(data); +} diff --git a/ecdb/trunk/src/ecdb_image.c b/ecdb/trunk/src/ecdb_image.c index f9910e9..e2e25c3 100644 --- a/ecdb/trunk/src/ecdb_image.c +++ b/ecdb/trunk/src/ecdb_image.c @@ -47,8 +47,8 @@ ecdb_source_destroy(Ecdb_Source *src) child = src->children[i]; ecdb_source_destroy(child); } - - free(src); + FREE(src->children); + FREE(src); } void diff --git a/ecdb/trunk/src/ecdb_misc.c b/ecdb/trunk/src/ecdb_misc.c index 7823dbe..3a1e609 100644 --- a/ecdb/trunk/src/ecdb_misc.c +++ b/ecdb/trunk/src/ecdb_misc.c @@ -38,8 +38,8 @@ ecdb_project_type_set(Ecdb_Project *proj, unsigned int t) int ecdb_shutdown(void *data, int type, void *event) { - if (em->drives) - ecore_list_destroy(em->drives); + if (em->drives) ecore_list_destroy(em->drives); + if (em->dnd_candidates) ecore_list_destroy(em->dnd_candidates); free(em); if (!ecore_file_recursive_rm("/tmp/ecdb"))