metacity r3787 - in trunk: . src/core



Author: tthurman
Date: Sun Jul 13 22:16:23 2008
New Revision: 3787
URL: http://svn.gnome.org/viewvc/metacity?rev=3787&view=rev

Log:
2008-07-13  Elijah Newren  <newren gmail com>

        * src/core/workspace.c (meta_workspace_free): Don't attempt to
        double-free struts, edges and regions if work areas have already
        been invalidated at the time of freeing a workspace.
        Possible fix to #361804.


Modified:
   trunk/   (props changed)
   trunk/ChangeLog
   trunk/src/core/workspace.c

Modified: trunk/src/core/workspace.c
==============================================================================
--- trunk/src/core/workspace.c	(original)
+++ trunk/src/core/workspace.c	Sun Jul 13 22:16:23 2008
@@ -116,15 +116,25 @@
   g_free (workspace->work_area_xinerama);
 
   g_list_free (workspace->mru_list);
-  g_slist_free (workspace->all_struts);
   g_list_free (workspace->list_containing_self);
 
-  for (i = 0; i < screen->n_xinerama_infos; i++)
-    meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
-  g_free (workspace->xinerama_region);
-  meta_rectangle_free_list_and_elements (workspace->screen_region);
-  meta_rectangle_free_list_and_elements (workspace->screen_edges);
-  meta_rectangle_free_list_and_elements (workspace->xinerama_edges);
+  /* screen.c:update_num_workspaces(), which calls us, removes windows from
+   * workspaces first, which can cause the workareas on the workspace to be
+   * invalidated (and hence for struts/regions/edges to be freed).
+   * So, no point trying to double free it; that causes a crash
+   * anyway.  #361804.
+   */
+
+  if (!workspace->work_areas_invalid)
+    {
+      g_slist_free (workspace->all_struts);
+      for (i = 0; i < screen->n_xinerama_infos; i++)
+        meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
+      g_free (workspace->xinerama_region);
+      meta_rectangle_free_list_and_elements (workspace->screen_region);
+      meta_rectangle_free_list_and_elements (workspace->screen_edges);
+      meta_rectangle_free_list_and_elements (workspace->xinerama_edges);
+    }
 
   g_free (workspace);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]