Control: tags 1081338 + pending
Dear maintainer, I've prepared an NMU for xorg-server (versioned as 2:21.1.16-1.1) and uploaded it to DELAYED/5. Please feel free to tell me if I should cancel it. Regards, Salvatore
diffstat for xorg-server_21.1.16-1 xorg-server_21.1.16-1.1 debian/patches/09_dix-Hold-input-lock-for-AttachDevice.diff | 91 ++++++++++++ xorg-server-21.1.16/debian/changelog | 8 + xorg-server-21.1.16/debian/patches/series | 1 3 files changed, 100 insertions(+) diff -u xorg-server-21.1.16/debian/changelog xorg-server-21.1.16/debian/changelog --- xorg-server-21.1.16/debian/changelog +++ xorg-server-21.1.16/debian/changelog @@ -1,3 +1,11 @@ +xorg-server (2:21.1.16-1.1) unstable; urgency=medium + + * Non-maintainer upload. + * dix: Hold input lock for AttachDevice() (CVE-2022-49737) + (Closes: #1081338) + + -- Salvatore Bonaccorso <[email protected]> Fri, 02 May 2025 15:04:19 +0200 + xorg-server (2:21.1.16-1) unstable; urgency=medium * New upstream release. Fixes: diff -u xorg-server-21.1.16/debian/patches/series xorg-server-21.1.16/debian/patches/series --- xorg-server-21.1.16/debian/patches/series +++ xorg-server-21.1.16/debian/patches/series @@ -3,3 +3,4 @@ 06_use-intel-only-on-pre-gen4.diff 07_use-modesetting-driver-by-default-on-GeForce.diff 08_apple_silicon_config.diff +09_dix-Hold-input-lock-for-AttachDevice.diff only in patch2: unchanged: --- xorg-server-21.1.16.orig/debian/patches/09_dix-Hold-input-lock-for-AttachDevice.diff +++ xorg-server-21.1.16/debian/patches/09_dix-Hold-input-lock-for-AttachDevice.diff @@ -0,0 +1,91 @@ +From: tholin <[email protected]> +Date: Tue, 4 Jan 2022 12:08:11 +0000 +Subject: dix: Hold input lock for AttachDevice() +Origin: https://gitlab.freedesktop.org/xorg/xserver/-/commit/ba830583e6a8e9a78f09e2d723813c03142b11f6 +Bug-Debian: https://bugs.debian.org/1081338 +Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2022-49737 + +Fix the following race: + +Possible data race during read of size 8 at 0xA112510 by thread #6 +Locks held: 1, at address 0x366B40 + at 0x14C8B9: GetMaster (devices.c:2691) + by 0x15CFC5: IsFloating (events.c:346) + by 0x2B9554: miPointerGetScreen (mipointer.c:527) + by 0x1A5136: xf86PostButtonEventM (xf86Xinput.c:1379) + by 0x1A52BD: xf86PostButtonEvent (xf86Xinput.c:1345) + by 0x485F45B: EvdevProcessEvent (in /usr/lib64/xorg/modules/input/evdev_drv.so) + by 0x485FDAC: EvdevReadInput (in /usr/lib64/xorg/modules/input/evdev_drv.so) + by 0x195427: xf86ReadInput (xf86Events.c:247) + by 0x2CC113: InputReady (inputthread.c:180) + by 0x2CE4EA: ospoll_wait (ospoll.c:657) + by 0x2CC077: InputThreadDoWork (inputthread.c:369) + by 0x484A336: mythread_wrapper (hg_intercepts.c:406) + +This conflicts with a previous write of size 8 by thread #1 +Locks held: none + at 0x14D2C6: AttachDevice (devices.c:2609) + by 0x15CF85: ReattachToOldMaster (events.c:1457) + by 0x1647DD: DeactivateKeyboardGrab (events.c:1700) + by 0x25D7F1: ProcXIUngrabDevice (xigrabdev.c:169) + by 0x2552AD: ProcIDispatch (extinit.c:398) + by 0x155291: Dispatch (dispatch.c:479) + by 0x158CBA: dix_main (main.c:276) + by 0x143A3D: main (stubmain.c:34) + Address 0xa112510 is 336 bytes inside a block of size 904 alloc'd + at 0x4846571: calloc (vg_replace_malloc.c:1328) + by 0x14A0B3: AddInputDevice (devices.c:260) + by 0x1A31A0: xf86ActivateDevice (xf86Xinput.c:365) + by 0x1A4549: xf86NewInputDevice (xf86Xinput.c:948) + by 0x1A4B44: NewInputDeviceRequest (xf86Xinput.c:1090) + by 0x1B81FE: device_added (udev.c:282) + by 0x1B8516: config_udev_init (udev.c:439) + by 0x1B7091: config_init (config.c:50) + by 0x197970: InitInput (xf86Init.c:814) + by 0x158C6B: dix_main (main.c:250) + by 0x143A3D: main (stubmain.c:34) + Block was alloc'd by thread #1 + +The steps to trigger the race are: +1. Main thread does cleanup at mipointer.c:360 setting the slave device's + miPointerPtr to null. +2. Input thread use MIPOINTER in mipointer.c and get the slave's + miPointerPtr = null. +3. Main thread updates dev->master at devices.c:2609. +4. MIPOINTER would now return the master's miPointerPtr but the input + thread already got the slave's miPointerPtr in step 2 and segfaults by + null ptr deref. + +Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1260 +Signed-off-by: Thomas Lindroth <[email protected]> +(cherry picked from commit dc7cb45482cea6ccec22d117ca0b489500b4d0a0) + +Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1874> +--- + dix/devices.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dix/devices.c b/dix/devices.c +index 77bac49242d6..5f6d32e537a6 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -2672,6 +2672,8 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master) + if (IsFloating(dev) && !master && dev->enabled) + return Success; + ++ input_lock(); ++ + /* free the existing sprite. */ + if (IsFloating(dev) && dev->spriteInfo->paired == dev) { + screen = miPointerGetScreen(dev); +@@ -2715,6 +2717,7 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master) + RecalculateMasterButtons(master); + } + ++ input_unlock(); + /* XXX: in theory, the MD should change back to its old, original + * classes when the last SD is detached. Thanks to the XTEST devices, + * we'll always have an SD attached until the MD is removed. +-- +2.49.0 +

