gmain: free source_lists when freeing GMainContext
authorDan Winship <danw@gnome.org>
Thu, 23 Aug 2012 16:33:43 +0000 (12:33 -0400)
committerDan Winship <danw@gnome.org>
Mon, 27 Aug 2012 11:23:59 +0000 (07:23 -0400)
If a context was freed with sources still attached, those sources
correctly got destroyed, but the corresponding GSourceList structs
were being leaked.

https://bugzilla.gnome.org/show_bug.cgi?id=682560

glib/gmain.c

index 603dd3f..4274269 100644 (file)
@@ -499,6 +499,8 @@ g_main_context_unref (GMainContext *context)
 {
   GSourceIter iter;
   GSource *source;
+  GList *sl_iter;
+  GSourceList *list;
 
   g_return_if_fail (context != NULL);
   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); 
@@ -516,6 +518,12 @@ g_main_context_unref (GMainContext *context)
       source->context = NULL;
       g_source_destroy_internal (source, context, FALSE);
     }
+  for (sl_iter = context->source_lists; sl_iter; sl_iter = sl_iter->next)
+    {
+      list = sl_iter->data;
+      g_slice_free (GSourceList, list);
+    }
+  g_list_free (context->source_lists);
 
   g_mutex_clear (&context->mutex);