Blame SOURCES/0001-dix-Fix-use-after-free-in-input-device-shutdown.patch

f4a46c
From 1801fe0ac3926882d47d7e1ad6c0518a2cdffd41 Mon Sep 17 00:00:00 2001
f4a46c
From: Povilas Kanapickas <povilas@radix.lt>
f4a46c
Date: Sun, 19 Dec 2021 18:11:07 +0200
f4a46c
Subject: [PATCH] dix: Fix use after free in input device shutdown
f4a46c
f4a46c
This fixes access to freed heap memory via dev->master. E.g. when
f4a46c
running BarrierNotify.ReceivesNotifyEvents/7 test from
f4a46c
xorg-integration-tests:
f4a46c
f4a46c
==24736==ERROR: AddressSanitizer: heap-use-after-free on address
f4a46c
0x619000065020 at pc 0x55c450e2b9cf bp 0x7fffc532fd20 sp 0x7fffc532fd10
f4a46c
READ of size 4 at 0x619000065020 thread T0
f4a46c
    #0 0x55c450e2b9ce in GetMaster ../../../dix/devices.c:2722
f4a46c
    #1 0x55c450e9d035 in IsFloating ../../../dix/events.c:346
f4a46c
    #2 0x55c4513209c6 in GetDeviceUse ../../../Xi/xiquerydevice.c:525
f4a46c
../../../Xi/xichangehierarchy.c:95
f4a46c
    #4 0x55c450e3455c in RemoveDevice ../../../dix/devices.c:1204
f4a46c
../../../hw/xfree86/common/xf86Xinput.c:1142
f4a46c
    #6 0x55c450e17b04 in CloseDeviceList ../../../dix/devices.c:1038
f4a46c
    #7 0x55c450e1de85 in CloseDownDevices ../../../dix/devices.c:1068
f4a46c
    #8 0x55c450e837ef in dix_main ../../../dix/main.c:302
f4a46c
    #9 0x55c4517a8d93 in main ../../../dix/stubmain.c:34
f4a46c
(/lib/x86_64-linux-gnu/libc.so.6+0x28564)
f4a46c
    #11 0x55c450d0113d in _start (/usr/lib/xorg/Xorg+0x117713d)
f4a46c
f4a46c
0x619000065020 is located 160 bytes inside of 912-byte region
f4a46c
[0x619000064f80,0x619000065310)
f4a46c
freed by thread T0 here:
f4a46c
(/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf)
f4a46c
    #1 0x55c450e19f1c in CloseDevice ../../../dix/devices.c:1014
f4a46c
    #2 0x55c450e343a4 in RemoveDevice ../../../dix/devices.c:1186
f4a46c
../../../hw/xfree86/common/xf86Xinput.c:1142
f4a46c
    #4 0x55c450e17b04 in CloseDeviceList ../../../dix/devices.c:1038
f4a46c
    #5 0x55c450e1de85 in CloseDownDevices ../../../dix/devices.c:1068
f4a46c
    #6 0x55c450e837ef in dix_main ../../../dix/main.c:302
f4a46c
    #7 0x55c4517a8d93 in main ../../../dix/stubmain.c:34
f4a46c
(/lib/x86_64-linux-gnu/libc.so.6+0x28564)
f4a46c
f4a46c
previously allocated by thread T0 here:
f4a46c
(/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10ddc6)
f4a46c
    #1 0x55c450e1c57b in AddInputDevice ../../../dix/devices.c:259
f4a46c
    #2 0x55c450e34840 in AllocDevicePair ../../../dix/devices.c:2755
f4a46c
    #3 0x55c45130318f in add_master ../../../Xi/xichangehierarchy.c:152
f4a46c
../../../Xi/xichangehierarchy.c:465
f4a46c
    #5 0x55c4512cb9f5 in ProcIDispatch ../../../Xi/extinit.c:390
f4a46c
    #6 0x55c450e6a92b in Dispatch ../../../dix/dispatch.c:551
f4a46c
    #7 0x55c450e834b7 in dix_main ../../../dix/main.c:272
f4a46c
    #8 0x55c4517a8d93 in main ../../../dix/stubmain.c:34
f4a46c
(/lib/x86_64-linux-gnu/libc.so.6+0x28564)
f4a46c
f4a46c
The problem is caused by dev->master being not reset when disabling the
f4a46c
device, which then causes dangling pointer when the master device itself
f4a46c
is being deleted when exiting whole server.
f4a46c
f4a46c
Note that RecalculateMasterButtons() requires dev->master to be still
f4a46c
valid, so we can reset it only at the end of function.
f4a46c
f4a46c
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
f4a46c
---
f4a46c
 dix/devices.c | 1 +
f4a46c
 1 file changed, 1 insertion(+)
f4a46c
f4a46c
diff --git a/dix/devices.c b/dix/devices.c
f4a46c
index e62c34c55..5f9ce1678 100644
f4a46c
--- a/dix/devices.c
f4a46c
+++ b/dix/devices.c
f4a46c
@@ -520,6 +520,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
f4a46c
     }
f4a46c
 
f4a46c
     RecalculateMasterButtons(dev);
f4a46c
+    dev->master = NULL;
f4a46c
 
f4a46c
     return TRUE;
f4a46c
 }
f4a46c
-- 
f4a46c
2.43.0
f4a46c