mirror of
https://github.com/X11Libre/xserver.git
synced 2026-11-14 05:14:45 +00:00
| Filename | Latest commit message | Latest commit date |
|---|---|---|
input_constrain_cursor() writes barrier hit and leave events into the
InputEventList buffer without checking how many slots remain.
The buffer is allocated by the DDX at GetMaximumEventsNum() (100) entries
and may contain one raw event already. A client can create more than 100
pointer barriers, pre-arm them as released via XIBarrierReleasePointer,
and then trigger a single pointer motion that crosses all barriers
simultaneously. The leave event loop iterates every hit barrier and
writes one event per barrier, overflowing the 100-slot buffer.
In an ideal world we'd change the InternalEvent* pointer to a struct
that contains allocated size, number of events and the pointer itself
but we're crossing public APIs here and that requires an ABI bump.
So we make do with cutting off the number of barrier events at 64 which
should be low enough to not trigger the issue. However, for the 100+
barrier case this means we only send BarierHit events, not BarrierRelease.
Potentially leaving a client stuck.
We mitigate that problem by simply refusing to create more than 32
barriers per screen (which on its own would also fix the issue, but hey,
'doppelt gemoppelt' as they say).
This vulnerability was discovered by:
Anonymous working with TrendAI Zero Day Initiative
ZDI-CAN-31938
CVE-2026-93519
Assisted-by: Claude:claude-opus-4-6
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2341>
(cherry picked from commit
|
||
| .. | ||
| allowev.c | ||
| chgdctl.c | ||
| chgfctl.c | ||
| chgkbd.c | ||
| chgkmap.c | ||
| chgprop.c | ||
| chgptr.c | ||
| chgptr.h | ||
| closedev.c | ||
| devbell.c | ||
| exevents.c | ||
| exglobals.h | ||
| extinit.c | ||
| getbmap.c | ||
| getdctl.c | ||
| getfctl.c | ||
| getfocus.c | ||
| getkmap.c | ||
| getmmap.c | ||
| getprop.c | ||
| getprop.h | ||
| getselev.c | ||
| getvers.c | ||
| grabdev.c | ||
| grabdev.h | ||
| grabdevb.c | ||
| grabdevk.c | ||
| gtmotion.c | ||
| handlers.h | ||
| listdev.c | ||
| meson.build | ||
| opendev.c | ||
| queryst.c | ||
| selectev.c | ||
| sendexev.c | ||
| setbmap.c | ||
| setdval.c | ||
| setfocus.c | ||
| setmmap.c | ||
| setmode.c | ||
| stubs.c | ||
| ungrdev.c | ||
| ungrdevb.c | ||
| ungrdevk.c | ||
| xiallowev.c | ||
| xibarriers.c | ||
| xibarriers.h | ||
| xichangecursor.c | ||
| xichangehierarchy.c | ||
| xichangehierarchy.h | ||
| xigetclientpointer.c | ||
| xigrabdev.c | ||
| xipassivegrab.c | ||
| xiproperty.c | ||
| xiproperty.h | ||
| xiquerydevice.c | ||
| xiquerydevice.h | ||
| xiquerypointer.c | ||
| xiqueryversion.c | ||
| xiselectev.c | ||
| xisetclientpointer.c | ||
| xisetdevfocus.c | ||
| XIstubs.h | ||
| xiwarppointer.c | ||