mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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 <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
cfefa0206d
commit
fa5afc697e
2 changed files with 13 additions and 2 deletions
|
@ -1023,6 +1023,9 @@ void insert_trip(dive_trip_t **dive_trip_p)
|
||||||
|
|
||||||
static inline void delete_trip(GList *trip)
|
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);
|
dive_trip_list = g_list_delete_link(dive_trip_list, trip);
|
||||||
#ifdef DEBUG_TRIP
|
#ifdef DEBUG_TRIP
|
||||||
dump_trip_list();
|
dump_trip_list();
|
||||||
|
@ -1169,7 +1172,7 @@ static void fill_dive_list(void)
|
||||||
if (dive_trip->when > dive->when)
|
if (dive_trip->when > dive->when)
|
||||||
dive_trip->when = dive->when;
|
dive_trip->when = dive->when;
|
||||||
if (!dive_trip->location && dive->location)
|
if (!dive_trip->location && dive->location)
|
||||||
dive_trip->location = dive->location;
|
dive_trip->location = strdup(dive->location);
|
||||||
if (dive_trip != last_trip) {
|
if (dive_trip != last_trip) {
|
||||||
last_trip = dive_trip;
|
last_trip = dive_trip;
|
||||||
/* create trip entry */
|
/* create trip entry */
|
||||||
|
|
10
gtk-gui.c
10
gtk-gui.c
|
@ -251,6 +251,14 @@ static gboolean ask_save_changes()
|
||||||
return quit;
|
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)
|
static void file_close(GtkWidget *w, gpointer data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -271,7 +279,7 @@ static void file_close(GtkWidget *w, gpointer data)
|
||||||
mark_divelist_changed(FALSE);
|
mark_divelist_changed(FALSE);
|
||||||
|
|
||||||
/* inlined version of g_list_free_full(dive_trip_list, free); */
|
/* 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);
|
g_list_free(dive_trip_list);
|
||||||
|
|
||||||
dive_trip_list = NULL;
|
dive_trip_list = NULL;
|
||||||
|
|
Loading…
Add table
Reference in a new issue