From 59b304d8a24fecd094296feb217823f0c73d6f82 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 8 Nov 2007 15:44:18 +1030 Subject: [PATCH] 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. --- dix/devices.c | 5 +---- dix/getevents.c | 7 +++++-- mi/mipointer.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 30fc7b33dd..c9831ea92b 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -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; } diff --git a/dix/getevents.c b/dix/getevents.c index 30443018c4..a23eabea2c 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -736,8 +736,11 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, pDev->valuator->lastx = x; pDev->valuator->lasty = y; - master->valuator->lastx = x; - master->valuator->lasty = y; + if (master) + { + master->valuator->lastx = x; + master->valuator->lasty = y; + } if (!coreOnly) { diff --git a/mi/mipointer.c b/mi/mipointer.c index 7b565799e0..b2f31c1d51 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -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;