[PATCH] dix: don't emulate scroll events for non-existing axes (#47281)
Chase Douglas
chase.douglas at canonical.com
Mon Apr 30 10:51:25 PDT 2012
On 04/26/2012 11:40 PM, Peter Hutterer wrote:
> Test case:
> - create a device with REL_HWHEEL and ABS_X and ABS_Y. evdev 2.7.0 will set
> that up as device with 1 relative axis
> - move pointer to VGA1
> - xrandr --output VGA1 --off
>
> Warps the pointer to the new spot and calls GPE with the x/y mask bits set.
> When running through the loop to check for scroll event, this overruns the
> axes and may try to emulate scroll events based on random garbage in the
> memory. If that memory contained non-zero for the scroll type but near-zero
> for the increment field, the server would hang in an infinite loop.
>
> This was the trigger for this suggested, never-merged, patch here:
> http://patchwork.freedesktop.org/patch/9543/
>
> X.Org Bug 47281 <http://bugs.freedesktop.org/show_bug.cgi?id=47281>
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> dix/getevents.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/dix/getevents.c b/dix/getevents.c
> index 61790fc..d4e927d 100644
> --- a/dix/getevents.c
> +++ b/dix/getevents.c
> @@ -1602,6 +1602,9 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
> /* Now turn the smooth-scrolling axes back into emulated button presses
> * for legacy clients, based on the integer delta between before and now */
> for (i = 0; i < valuator_mask_size(&mask); i++) {
> + if (i >= pDev->valuator->numAxes)
> + break;
> +
> if (!valuator_mask_isset(&mask, i))
> continue;
>
Why not do this instead:
for (i = 0;
i < valuator_mask_size(&mask) && i < pDev->valuator->numAxes;
i++) {
The functionality looks correct either way, so
Reviewed-by: Chase Douglas <chase.douglas at canonical.com>
-- Chase
More information about the xorg-devel
mailing list