From fa5afc697e664a93fc754e50dbfd15b2333028e7 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Tue, 2 Oct 2012 01:52:44 +0300 Subject: Fix memory leaks related to dive_trip->location When creating a new dive_trip from a dive, we should probably always copy the location via strdup(). However we then have to take care of the de-allocation in divelist.c:delete_trip() and gtk-gui.c:file_close(). Signed-off-by: Lubomir I. Ivanov Signed-off-by: Dirk Hohndel --- divelist.c | 5 ++++- gtk-gui.c | 10 +++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/divelist.c b/divelist.c index 9bdee1571..e09eca5f9 100644 --- a/divelist.c +++ b/divelist.c @@ -1023,6 +1023,9 @@ void insert_trip(dive_trip_t **dive_trip_p) static inline void delete_trip(GList *trip) { + dive_trip_t *dive_trip = (dive_trip_t *)g_list_nth_data(trip, 0); + if (dive_trip->location) + free(dive_trip->location); dive_trip_list = g_list_delete_link(dive_trip_list, trip); #ifdef DEBUG_TRIP dump_trip_list(); @@ -1169,7 +1172,7 @@ static void fill_dive_list(void) if (dive_trip->when > dive->when) dive_trip->when = dive->when; if (!dive_trip->location && dive->location) - dive_trip->location = dive->location; + dive_trip->location = strdup(dive->location); if (dive_trip != last_trip) { last_trip = dive_trip; /* create trip entry */ diff --git a/gtk-gui.c b/gtk-gui.c index 5a680c776..997694240 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -251,6 +251,14 @@ static gboolean ask_save_changes() return quit; } +static void dive_trip_unref(gpointer data, gpointer user_data) +{ + dive_trip_t *dive_trip = (dive_trip_t *)data; + if (dive_trip->location) + free(dive_trip->location); + free(data); +} + static void file_close(GtkWidget *w, gpointer data) { int i; @@ -271,7 +279,7 @@ static void file_close(GtkWidget *w, gpointer data) mark_divelist_changed(FALSE); /* inlined version of g_list_free_full(dive_trip_list, free); */ - g_list_foreach(dive_trip_list, (GFunc)free, NULL); + g_list_foreach(dive_trip_list, (GFunc)dive_trip_unref, NULL); g_list_free(dive_trip_list); dive_trip_list = NULL; -- cgit v1.2.3-70-g09d2