[PATCH xf86-video-ati] Only change Set/MoveCursor hooks from what we expect
Mario Kleiner
mario.kleiner.de at gmail.com
Wed Mar 7 03:45:18 UTC 2018
On 03/05/2018 10:56 PM, Alex Deucher wrote:
> On Mon, Mar 5, 2018 at 12:44 PM, Michel Dänzer <michel at daenzer.net> wrote:
>> From: Michel Dänzer <michel.daenzer at amd.com>
>>
>> Since xf86CursorCloseScreen runs after RADEONCloseScreen_KMS,
>> PointPriv->spriteFuncs doesn't point to the same struct in the latter as
>> in RADEONCursorInit_KMS. So we were restoring info->Set/MoveCursor to
>> the wrong struct. Then in the next server generation,
>> info->Set/MoveCursor would end up pointing to
>> drmmode_sprite_set/move_cursor, resulting in an infinite loop if one of
>> them was called.
>>
>> To avoid this, only change the Set/MoveCursor hooks if their values
>> match our expectations, otherwise leave them as is. This is kind of a
>> hack, but the alternative would be invasive and thus risky changes to
>> the way we're wrapping CloseScreen, and it's not even clear that can
>> work without changing xserver code.
>>
>> Fixes: 1fe8ca75974c ("Keep track of how many SW cursors are visible on
>> each screen")
>> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
>
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
>
Nope, not quite, unfortunately. Tested against x-server master, mesa
master, ati-ddx master, with sddm login manager. With a freshly started
server, now on a dual-x-screen setup, instead of an infinite loop, i get
a server crash as soon as i move the mouse cursor from X-Screen 0 to
X-Screen 1:
(gdb) c
Continuing.
Thread 1 "X" received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00000000004bcad2 in xf86CursorSetCursor (pDev=0x11912e0,
pScreen=0xf9a510, pCurs=0x1177610, x=32, y=358) at xf86CursorRD.c:345
#2 0x000000000057a758 in miPointerUpdateSprite (pDev=0x11912e0) at
mipointer.c:453
#3 0x000000000057aada in miPointerDisplayCursor (pDev=0x11912e0,
pScreen=0xf9a510, pCursor=0x1177610) at mipointer.c:206
#4 0x00000000004cb1b6 in CursorDisplayCursor (pDev=<optimized out>,
pScreen=0xf9a510, pCursor=0x1177610) at cursor.c:168
#5 0x000000000050f78b in AnimCurDisplayCursor (pDev=0x11912e0,
pScreen=0xf9a510, pCursor=0x1177610) at animcur.c:196
#6 0x00000000004473b8 in ChangeToCursor (pDev=0x11912e0,
cursor=0x1177610) at events.c:936
#7 0x000000000044b20a in CheckMotion (ev=ev at entry=0x7ffdad7a7060,
pDev=pDev at entry=0x11912e0) at events.c:3081
#8 0x000000000051ee6b in ProcessDeviceEvent
(ev=ev at entry=0x7ffdad7a7060, device=device at entry=0x11912e0) at
exevents.c:1716
#9 0x000000000051f5fb in ProcessOtherEvent (ev=0x7ffdad7a7060,
device=0x11912e0) at exevents.c:1873
#10 0x00000000005403a2 in ProcessPointerEvent (ev=0x7ffdad7a7060,
mouse=0x11912e0) at xkbAccessX.c:756
#11 0x0000000000571712 in mieqProcessDeviceEvent (dev=0x1368e10,
event=0x7ffdad7a7cc0, screen=0xf9a510) at mieq.c:496
#12 0x000000000057184a in mieqProcessInputEvents () at mieq.c:551
#13 0x000000000047a8a9 in ProcessInputEvents () at xf86Events.c:151
#14 0x000000000043e2a7 in Dispatch () at dispatch.c:417
#15 0x0000000000442568 in dix_main (argc=11, argv=0x7ffdad7a8ad8,
envp=<optimized out>) at main.c:276
#16 0x00007f20fdf60830 in __libc_start_main (main=0x42c520 <main>,
argc=11, argv=0x7ffdad7a8ad8, init=<optimized out>, fini=<optimized
out>, rtld_fini=<optimized out>, stack_end=0x7ffdad7a8ac8) at
../csu/libc-start.c:291
-mario
>> ---
>> src/radeon_kms.c | 16 ++++++++++------
>> 1 file changed, 10 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/radeon_kms.c b/src/radeon_kms.c
>> index 85390e306..790d4be16 100644
>> --- a/src/radeon_kms.c
>> +++ b/src/radeon_kms.c
>> @@ -2017,10 +2017,12 @@ static Bool RADEONCursorInit_KMS(ScreenPtr pScreen)
>> return FALSE;
>> }
>>
>> - info->SetCursor = PointPriv->spriteFuncs->SetCursor;
>> - info->MoveCursor = PointPriv->spriteFuncs->MoveCursor;
>> - PointPriv->spriteFuncs->SetCursor = drmmode_sprite_set_cursor;
>> - PointPriv->spriteFuncs->MoveCursor = drmmode_sprite_move_cursor;
>> + if (PointPriv->spriteFuncs->SetCursor != drmmode_sprite_set_cursor) {
>> + info->SetCursor = PointPriv->spriteFuncs->SetCursor;
>> + info->MoveCursor = PointPriv->spriteFuncs->MoveCursor;
>> + PointPriv->spriteFuncs->SetCursor = drmmode_sprite_set_cursor;
>> + PointPriv->spriteFuncs->MoveCursor = drmmode_sprite_move_cursor;
>> + }
>> }
>>
>> if (xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE))
>> @@ -2184,8 +2186,10 @@ static Bool RADEONCloseScreen_KMS(ScreenPtr pScreen)
>> miPointerScreenPtr PointPriv =
>> dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
>>
>> - PointPriv->spriteFuncs->SetCursor = info->SetCursor;
>> - PointPriv->spriteFuncs->MoveCursor = info->MoveCursor;
>> + if (PointPriv->spriteFuncs->SetCursor == drmmode_sprite_set_cursor) {
>> + PointPriv->spriteFuncs->SetCursor = info->SetCursor;
>> + PointPriv->spriteFuncs->MoveCursor = info->MoveCursor;
>> + }
>> }
>>
>> pScreen->BlockHandler = info->BlockHandler;
>> --
>> 2.16.2
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list