diff options
author | Michel Dänzer <mdaenzer@redhat.com> | 2023-03-10 12:39:30 +0100 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2023-03-27 08:19:31 +0000 |
commit | 754d6b6dd0a9ec42d75247596a8885bf54352ee7 (patch) | |
tree | 9176de8b1c855380712c4a24e0c39cad980d40ab /hw/xwayland/xwayland-present.h | |
parent | 4d1cd7cdc22013ed8de17d3218b9790b7027e1fe (diff) | |
download | xserver-754d6b6dd0a9ec42d75247596a8885bf54352ee7.tar.gz |
xwayland: Prevent nested xwl_present_for_each_frame_callback calls
It could happen with the following call path:
frame_callback
xwl_present_frame_callback
xwl_present_msc_bump
xwl_present_execute
xwl_present_flip
xwl_window_create_frame_callback
The nested loop called xwl_present_reset_timer, which may end up calling
xorg_list_del for the entry after the one frame_callback started the
chain for. This resulted in the outer loop never terminating, because
its next element wasn't hooked up to the list anymore.
We avoid this by calling xwl_present_reset_timer as needed in
frame_callback, and bailing from xwl_window_create_frame_callback if it
was called from the former.
We also catch nested calls and FatalError if they ever happen again due
to another bug.
v2:
* Leave xwl_present_reset_timer call in xwl_present_frame_callback,
needed if xwl_present_msc_bump didn't hook up the window to the frame
callback list again.
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1442
Diffstat (limited to 'hw/xwayland/xwayland-present.h')
-rw-r--r-- | hw/xwayland/xwayland-present.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h index 620e6c5ca..806272089 100644 --- a/hw/xwayland/xwayland-present.h +++ b/hw/xwayland/xwayland-present.h @@ -61,6 +61,7 @@ struct xwl_present_event { PixmapPtr pixmap; }; +Bool xwl_present_entered_for_each_frame_callback(void); void xwl_present_for_each_frame_callback(struct xwl_window *xwl_window, void iter_func(struct xwl_present_window *)); void xwl_present_reset_timer(struct xwl_present_window *xwl_present_window); |