Peter Hutterer
f3f026b3cd
sync: fix deletion of counters and fences
...
Both FreeCounter() and miSyncDestroyFence() iterate over the trigger list
and invoke the CounterDestroyed callback on each trigger.
The CounterDestroyed callback (e.g. SyncAwaitTriggerFired) may call
FreeResource/FreeAwait, which frees the SyncAwaitUnion containing all
SyncAwait structs in the same Await group.
When multiple conditions in a single Await reference the same sync
object (counter or fence), the first callback frees all SyncAwait
structs while subsequent trigger list nodes still reference them. On the
next iteration, reading ptl->next or ptl->pTrigger dereferences freed
memory, leading to a use-after-free.
We need separate fixes for separate issues here to fix this in one go
- use our null-terminated list macro to make sure our next pointer stays
valid (the code accessed ptl->next after freeing it)
- update the list head before deleting the trigger, eventually this ends
up being NULL anyway but meanwhile the list head is a valid list
during CounterDestroyed
- check if we actually do have a trigger before dereferencing the
callback
- Set all triggers to NULL if they are shared so we don't dereference
potentially freed memory
This vulnerability was discovered by:
Anonymous working with TrendAI Zero Day Initiative
ZDI-CAN-30159 (miSyncDestroyFence), ZDI-CAN-30163 (FreeCounter)
Assisted-by: Claude:claude-opus-4-6
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2228 >
2026-06-03 15:42:12 +02:00
..
namespace
xext: namespace: fix printf format string
2025-12-11 15:04:42 +01:00
bigreq.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
dpms.c
dix: add dixAllocServerXID()
2025-06-12 17:21:48 +02:00
dpmsproc.h
Xext: drop checking for HAVE_DIX_CONFIG_H
2025-06-12 16:50:20 +02:00
geext.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
geext_priv.h
xext: add/fix include guards where missing/broken
2025-06-27 13:58:05 +02:00
hashtable.c
xext: replace xallocarray() by calloc()
2025-06-12 17:21:43 +02:00
hashtable.h
Xext: hashtable.h: unexport functions not used by drivers
2025-06-12 16:51:36 +02:00
meson.build
treewide: remove "lib" prefix in static_library names (meson)
2025-07-03 12:01:52 +02:00
panoramiX.c
panoramiX: fail if we can't allocate our visual arrays
2026-05-01 18:51:19 +02:00
panoramiX.h
composite: clean up including panoramix headers
2025-06-12 17:21:43 +02:00
panoramiXh.h
xext: add/fix include guards where missing/broken
2025-06-27 13:58:05 +02:00
panoramiXprocs.c
panoramix: protect against allocaton failure
2025-06-12 17:21:44 +02:00
panoramiXsrv.h
panoramix: export PanoramiXTranslateVisualID for nvidia
2025-06-16 10:32:48 +02:00
panoramiXSwap.c
Xext: clean up including panoramix headers
2025-06-12 17:21:43 +02:00
saver.c
saver: re-fetch screen private after CheckScreenPrivate in CreateSaverWindow
2026-06-03 15:33:26 +02:00
security.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
securitysrv.h
Xext: security: drop not needed include
2025-06-12 16:30:13 +02:00
shape.c
Xext: shape: fix non-ximerama build
2025-08-12 11:07:24 +02:00
shm.c
Xext/shm: add missing reply byte-swap in ProcShmCreateSegment
2026-04-27 15:20:43 +02:00
shmint.h
xext: Fix shmint.h to not use headers outside of sdk_HEADERS
2013-11-14 10:22:15 +09:00
sleepuntil.c
Xext: use calloc() instead of malloc()
2025-06-12 16:48:11 +02:00
sleepuntil.h
Xext: drop checking for HAVE_DIX_CONFIG_H
2025-06-12 16:50:20 +02:00
sync.c
sync: fix deletion of counters and fences
2026-06-03 15:42:12 +02:00
syncsdk.h
xsync: Add resource inside of SyncCreate, export SyncCreate
2019-04-17 14:01:17 -07:00
syncsrv.h
sync: Convert from "CARD64" to int64_t.
2017-09-20 13:19:27 -04:00
vidmode.c
Xext/vidmode: fix SProcVidModeSwitchToMode swapping only screen field
2026-04-27 15:17:23 +02:00
xace.c
xace: export XaceRegisterCallback() and XaceDeleteCallback()
2025-06-12 17:21:45 +02:00
xace.h
Xext: Fix typo in xace.h
2025-06-27 17:10:33 +02:00
xacestr.h
dix: move over private defintions from selection.h to private header
2025-06-12 17:21:46 +02:00
xcmisc.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
xf86bigfont.c
xf86bigfont: fix compiler warning on unused variable
2025-07-01 17:01:07 +02:00
xf86bigfontsrv.h
Move extension initialisation prototypes into extinit.h
2012-07-09 23:06:41 -07:00
xres.c
Xext/xres: add missing byte-swap of spec entries in SProcXResQueryClientIds
2026-04-27 17:22:20 +02:00
xselinux.h
include: unpexport SELINUX_* consts from include/global.h
2024-03-25 19:40:04 +00:00
xselinux_ext.c
dix: move over private defintions from selection.h to private header
2025-06-12 17:21:46 +02:00
xselinux_hooks.c
selinux: remap security classes on policyload
2026-04-21 10:45:12 +02:00
xselinux_label.c
drop obsolete HAVE_DIX_CONFIG_H
2024-10-10 13:38:31 +00:00
xselinuxint.h
include: drop obsolete registry.h
2024-03-03 23:20:06 +00:00
xtest.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
xvdisp.c
Zero out structs to avoid leaking information via padding
2026-04-27 15:16:13 +02:00
xvdisp.h
xext: add/fix include guards where missing/broken
2025-06-27 13:58:05 +02:00
xvdix.h
treewide: preemptively revert !1714 where it affects ABI compatibility
2025-06-16 10:32:48 +02:00
xvdix_priv.h
Xext: xv: fix redefinition of typedef 'XvPortNotifyPtr'
2025-08-05 18:59:43 +02:00
xvmain.c
miext: move over extinit_priv.h from include
2025-06-12 17:21:46 +02:00
xvmc.c
xres/xkb/xvmc/modesetting: Fix incorrect pointer data size usage
2025-06-13 13:01:24 +02:00
xvmcext.h
xvmc: unexport XvMCFindXvImage()
2024-10-10 19:59:48 +00:00