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) | ||||
| { | ||||
| 	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 */ | ||||
|  |  | |||
							
								
								
									
										10
									
								
								gtk-gui.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue