Index: xorg-server-1.11.3.901/dix/getevents.c =================================================================== --- xorg-server-1.11.3.901.orig/dix/getevents.c 2012-02-28 17:00:05.000000000 +0100 +++ xorg-server-1.11.3.901/dix/getevents.c 2012-02-28 17:35:51.000000000 +0100 @@ -205,13 +205,15 @@ if (valuator_mask_isset(mask, i)) { SetBit(event->valuators.mask, i); - if (valuator_get_mode(dev, i) == Absolute) + if (!dev->valuator || (dev->valuator->numAxes <= i) || + (valuator_get_mode(dev, i) == Absolute)) SetBit(event->valuators.mode, i); event->valuators.data[i] = valuator_mask_get(mask, i); event->valuators.data_frac[i] = dev->last.remainder[i] * (1 << 16) * (1 << 16); } - else if (valuator_get_mode(dev, i) == Absolute) + else if (dev->valuator && (dev->valuator->numAxes > i) && + (valuator_get_mode(dev, i) == Absolute)) event->valuators.data[i] = dev->valuator->axisVal[i]; } } @@ -640,7 +642,7 @@ { AxisInfoPtr axis; - if (axisNum >= pDev->valuator->numAxes) + if (!pDev->valuator || axisNum >= pDev->valuator->numAxes) return; axis = pDev->valuator->axes + axisNum; @@ -1185,7 +1187,8 @@ if (flags & POINTER_ABSOLUTE) { - if (flags & POINTER_SCREEN) /* valuators are in screen coords */ + if ((flags & POINTER_SCREEN) && /* valuators are in screen coords */ + pDev->valuator && (pDev->valuator->numAxes >= 2)) { int scaled;