mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-06 00:30:08 +00:00
Make _gdk_window_process_updates_recurse reentrancy safe
Apps may change the window hierarchy while recursing over it by destroying windows from the expose event handler. We need to copy the children list and ref all the children while recursing. This fixes some crashers in gedit (bug #589367, bug #591434)
This commit is contained in:
parent
7667c4d8dc
commit
9f82243197
@ -4751,17 +4751,21 @@ _gdk_window_process_updates_recurse (GdkWindow *window,
|
||||
GdkWindowObject *child;
|
||||
GdkRegion *child_region;
|
||||
GdkRectangle r;
|
||||
GList *l;
|
||||
GList *l, *children;
|
||||
|
||||
if (gdk_region_empty (expose_region))
|
||||
return;
|
||||
|
||||
/* Make this reentrancy safe for expose handlers freeing windows */
|
||||
children = g_list_copy (private->children);
|
||||
g_list_foreach (children, g_object_ref, NULL);
|
||||
|
||||
/* Iterate over children, starting at topmost */
|
||||
for (l = private->children; l != NULL; l = l->next)
|
||||
for (l = children; l != NULL; l = l->next)
|
||||
{
|
||||
child = l->data;
|
||||
|
||||
if (!GDK_WINDOW_IS_MAPPED (child) || child->input_only || child->composited)
|
||||
if (child->destroyed || !GDK_WINDOW_IS_MAPPED (child) || child->input_only || child->composited)
|
||||
continue;
|
||||
|
||||
/* Ignore offscreen children, as they don't draw in their parent and
|
||||
@ -4799,6 +4803,9 @@ _gdk_window_process_updates_recurse (GdkWindow *window,
|
||||
gdk_region_destroy (child_region);
|
||||
}
|
||||
|
||||
g_list_foreach (children, g_object_unref, NULL);
|
||||
g_list_free (children);
|
||||
|
||||
if (!gdk_region_empty (expose_region))
|
||||
{
|
||||
if (private->event_mask & GDK_EXPOSURE_MASK)
|
||||
|
Loading…
Reference in New Issue
Block a user