dix, mi: stop segfaults when a floating device emits events.

For pointers: don't try to set master->valuator fields if there is no master.
For keyboards: check if device is valid before trying to access the fields in
miPointerGetScreen (btw. this disables DGA events for floating keyboards).

Also stop the hideous number of ErrorFs if we request the paired device for a
floating dev.
This commit is contained in:
Peter Hutterer 2007-11-08 15:44:18 +10:30
parent 3063f0c667
commit 59b304d8a2
3 changed files with 7 additions and 7 deletions

View File

@ -2265,11 +2265,8 @@ GetPairedDevice(DeviceIntPtr dev)
dev = dev->u.master;
if (!dev->spriteInfo->paired)
{
ErrorF("[dix] No device paired with %d (%s).\n",
dev->id, dev->name);
return NULL;
}
return dev->spriteInfo->paired;
}

View File

@ -736,8 +736,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
pDev->valuator->lastx = x;
pDev->valuator->lasty = y;
if (master)
{
master->valuator->lastx = x;
master->valuator->lasty = y;
}
if (!coreOnly)
{

View File

@ -529,7 +529,7 @@ miPointerCurrentScreen ()
_X_EXPORT ScreenPtr
miPointerGetScreen(DeviceIntPtr pDev)
{
if (!pDev->isMaster && !pDev->u.master)
if (!pDev || (!pDev->isMaster && !pDev->u.master))
return NULL;
return MIPOINTER(pDev)->pScreen;