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