xwayland: Delete all frame_callback_list nodes in xwl_unrealize_window
We were only calling xwl_present_unrealize_window for the toplevel window, but the list can contain entries from child windows as well, in which case we were leaving dangling pointers to freed memory. Closes: https://gitlab.freedesktop.org/xorg/xserver/issues/1000 Fixes:c5067feaee
"xwayland: Use single frame callback for Present flips and normal updates" Reviewed-by: Olivier Fourdan <ofourdan@redhat.com> Tested-by: Olivier Fourdan <ofourdan@redhat.com> (cherry picked from commit5e91587302
)
This commit is contained in:
parent
a033571644
commit
b259485975
|
@ -524,14 +524,8 @@ xwl_present_flips_stop(WindowPtr window)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xwl_present_unrealize_window(WindowPtr window)
|
xwl_present_unrealize_window(struct xwl_present_window *xwl_present_window)
|
||||||
{
|
{
|
||||||
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
|
|
||||||
|
|
||||||
if (!xwl_present_window ||
|
|
||||||
xorg_list_is_empty(&xwl_present_window->frame_callback_list))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* The pending frame callback may never be called, so drop it and shorten
|
/* The pending frame callback may never be called, so drop it and shorten
|
||||||
* the frame timer interval.
|
* the frame timer interval.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -700,8 +700,15 @@ xwl_unrealize_window(WindowPtr window)
|
||||||
wl_callback_destroy(xwl_window->frame_callback);
|
wl_callback_destroy(xwl_window->frame_callback);
|
||||||
|
|
||||||
#ifdef GLAMOR_HAS_GBM
|
#ifdef GLAMOR_HAS_GBM
|
||||||
if (xwl_screen->present)
|
if (xwl_screen->present) {
|
||||||
xwl_present_unrealize_window(window);
|
struct xwl_present_window *xwl_present_window, *tmp;
|
||||||
|
|
||||||
|
xorg_list_for_each_entry_safe(xwl_present_window, tmp,
|
||||||
|
&xwl_window->frame_callback_list,
|
||||||
|
frame_callback_list) {
|
||||||
|
xwl_present_unrealize_window(xwl_present_window);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
free(xwl_window);
|
free(xwl_window);
|
||||||
|
|
|
@ -456,7 +456,7 @@ void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
|
||||||
void xwl_present_frame_callback(struct xwl_present_window *xwl_present_window);
|
void xwl_present_frame_callback(struct xwl_present_window *xwl_present_window);
|
||||||
Bool xwl_present_init(ScreenPtr screen);
|
Bool xwl_present_init(ScreenPtr screen);
|
||||||
void xwl_present_cleanup(WindowPtr window);
|
void xwl_present_cleanup(WindowPtr window);
|
||||||
void xwl_present_unrealize_window(WindowPtr window);
|
void xwl_present_unrealize_window(struct xwl_present_window *xwl_present_window);
|
||||||
#endif /* GLAMOR_HAS_GBM */
|
#endif /* GLAMOR_HAS_GBM */
|
||||||
|
|
||||||
#ifdef XV
|
#ifdef XV
|
||||||
|
|
Loading…
Reference in New Issue