Fix memory leak in gdkscreen-x11
When RandR 1.2 X driver doesn't return any usable multihead data the monitors array is freed, without freeing the memory allocated by the array elements before. Fixes bug #578354
This commit is contained in:
		 Carlos Garcia Campos
					Carlos Garcia Campos
				
			
				
					committed by
					
						 Matthias Clasen
						Matthias Clasen
					
				
			
			
				
	
			
			
			 Matthias Clasen
						Matthias Clasen
					
				
			
						parent
						
							f0b4779d56
						
					
				
				
					commit
					5261d14d6f
				
			| @ -663,6 +663,21 @@ init_fake_xinerama (GdkScreen *screen) | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_monitors (GdkX11Monitor *monitors, | ||||
|                gint           n_monitors) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_monitors; ++i) | ||||
|     { | ||||
|       g_free (monitors[i].output_name); | ||||
|       g_free (monitors[i].manufacturer); | ||||
|     } | ||||
|  | ||||
|   g_free (monitors); | ||||
| } | ||||
|  | ||||
| static int | ||||
| monitor_compare_function (GdkX11Monitor *monitor1, | ||||
|                           GdkX11Monitor *monitor2) | ||||
| @ -753,7 +768,11 @@ init_randr13 (GdkScreen *screen) | ||||
|   /* non RandR 1.2 X driver doesn't return any usable multihead data */ | ||||
|   if (randr12_compat) | ||||
|     { | ||||
|       g_array_free (monitors, TRUE); | ||||
|       guint n_monitors = monitors->len; | ||||
|  | ||||
|       free_monitors ((GdkX11Monitor *)g_array_free (monitors, FALSE), | ||||
| 		     n_monitors); | ||||
|  | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
| @ -856,21 +875,6 @@ init_xfree_xinerama (GdkScreen *screen) | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_monitors (GdkX11Monitor *monitors, | ||||
|                gint           n_monitors) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_monitors; ++i) | ||||
|     { | ||||
|       g_free (monitors[i].output_name); | ||||
|       g_free (monitors[i].manufacturer); | ||||
|     } | ||||
|  | ||||
|   g_free (monitors); | ||||
| } | ||||
|  | ||||
| static void | ||||
| deinit_multihead (GdkScreen *screen) | ||||
| { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user