xserver/present
Ville Syrjälä e9ffff31e4 present: Walk all children when setting window pixmaps
We currently skip setting the window pixmap on any window
not using its parent's pixmap. That does not work correctly
in the presence of reparenting.

Consider the following scenario:
1. window A is created as child of B
2. present starts flipping and sets the whole window
   tree to use pixmap X
3. window C is created (uses the screen pixmap by default)
4. window A is reparented to C
5. present stops flipping and attempts to set the
   whole window tree back to the screen pixmap,
   except the walk terminates at window C
   since it's using an unexpected pixmap, and
   window A is left with the stale pixmap X
6. pixmap X is destroyed
7. the X server segfaults on a rendering operation
   on window A due the stale pixmap

I managed to hit this with mpv (doing present flips)
and crack-attack (keeps alternating between a menu
window and an actual game window):
1. start both applications
2. start a game in crack-attack
3. fullscreen mpv
4. end the game in crack attack
5. unfullscreen mpv
6. the crack-attack menu window has appeared, but
   might be corrupted and doing stuff on it segfaults
   the X server

I suppose the other option might be to make new windows
automatically inherit their parent's pixmap instead
of using the screen pixmap. But I've not looked into
how that would affect eg. composite.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
2025-03-03 12:53:49 +02:00
..
meson.build build: Move epoll dependency check 2024-09-02 11:52:26 +00:00
present.c present: Walk all children when setting window pixmaps 2025-03-03 12:53:49 +02:00
present.h modesetting: unflip before any setcrtc() calls 2023-12-16 04:36:39 +00:00
present_event.c prevent name clash on Windows w/ RT_* defines 2024-04-15 18:59:23 -07:00
present_execute.c xwayland: add support for wp_linux_drm_syncobj_v1 2024-04-09 06:11:03 +00:00
present_fake.c Don't hardcode fps for fake screen 2021-07-29 08:09:00 +00:00
present_fence.c present: Include dix-config.h instead of xorg-config.h 2020-09-15 11:41:34 +02:00
present_notify.c dix: unexport some lookup functions 2024-04-15 18:11:57 -07:00
present_priv.h Present: add PresentCapabilitySyncobj and PresentPixmapSynced 2024-04-09 06:11:03 +00:00
present_request.c present: drop swapping request length fields 2025-02-06 22:28:49 +00:00
present_scmd.c present: present_scmd: drop obsolete include of <time.h> 2024-04-15 18:02:11 +00:00
present_screen.c rename old symbol PANORAMIX to XINERAMA 2025-02-06 15:51:27 +00:00
present_vblank.c present: signal explicit sync release point in present_vblank_scrap 2024-05-02 08:17:35 +00:00
presentext.h present: Add Present extension 2013-10-31 16:59:18 -07:00