dix: allow for button-only input devices (#21457)
Add a few checks for the existence of a valuator class on the device to avoid null-pointer dereferences for button events from devices without a valuator class. X.Org Bug 21457 <http://bugs.freedesktop.org/show_bug.cgi?id=21457> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
		
							parent
							
								
									9cf055892d
								
							
						
					
					
						commit
						0d440a1c6e
					
				| 
						 | 
					@ -767,7 +767,7 @@ moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
 | 
				
			||||||
    /* if attached, clip both x and y to the defined limits (usually
 | 
					    /* if attached, clip both x and y to the defined limits (usually
 | 
				
			||||||
     * co-ord space limit). If it is attached, we need x/y to go over the
 | 
					     * co-ord space limit). If it is attached, we need x/y to go over the
 | 
				
			||||||
     * limits to be able to change screens. */
 | 
					     * limits to be able to change screens. */
 | 
				
			||||||
    if(dev->u.master) {
 | 
					    if(dev->u.master && dev->valuator) {
 | 
				
			||||||
        if (valuator_get_mode(dev, 0) == Absolute)
 | 
					        if (valuator_get_mode(dev, 0) == Absolute)
 | 
				
			||||||
            clipAxis(dev, 0, x);
 | 
					            clipAxis(dev, 0, x);
 | 
				
			||||||
        if (valuator_get_mode(dev, 1) == Absolute)
 | 
					        if (valuator_get_mode(dev, 1) == Absolute)
 | 
				
			||||||
| 
						 | 
					@ -830,7 +830,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 | 
				
			||||||
    int old_screenx, old_screeny;
 | 
					    int old_screenx, old_screeny;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* scale x&y to screen */
 | 
					    /* scale x&y to screen */
 | 
				
			||||||
    if (dev->valuator->numAxes > 0) {
 | 
					    if (dev->valuator && dev->valuator->numAxes > 0) {
 | 
				
			||||||
        *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
 | 
					        *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
 | 
				
			||||||
                dev->valuator->axes + 0, NULL, scr->width);
 | 
					                dev->valuator->axes + 0, NULL, scr->width);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
| 
						 | 
					@ -838,7 +838,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 | 
				
			||||||
        *screenx_frac = dev->last.remainder[0];
 | 
					        *screenx_frac = dev->last.remainder[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (dev->valuator->numAxes > 1) {
 | 
					    if (dev->valuator && dev->valuator->numAxes > 1) {
 | 
				
			||||||
        *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
 | 
					        *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
 | 
				
			||||||
                dev->valuator->axes + 1, NULL, scr->height);
 | 
					                dev->valuator->axes + 1, NULL, scr->height);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
| 
						 | 
					@ -872,6 +872,8 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 | 
				
			||||||
        dev->u.master->last.remainder[1] = *screeny_frac;
 | 
					        dev->u.master->last.remainder[1] = *screeny_frac;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (dev->valuator)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        /* Crossed screen? Scale back to device coordiantes */
 | 
					        /* Crossed screen? Scale back to device coordiantes */
 | 
				
			||||||
        if(*screenx != old_screenx)
 | 
					        if(*screenx != old_screenx)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -885,6 +887,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 | 
				
			||||||
            *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
 | 
					            *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
 | 
				
			||||||
                                     dev->valuator->axes + 1, scr->height);
 | 
					                                     dev->valuator->axes + 1, scr->height);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* dropy x/y (device coordinates) back into valuators for next event */
 | 
					    /* dropy x/y (device coordinates) back into valuators for next event */
 | 
				
			||||||
    dev->last.valuators[0] = *x;
 | 
					    dev->last.valuators[0] = *x;
 | 
				
			||||||
| 
						 | 
					@ -904,6 +907,9 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
 | 
					updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (!dev->valuator)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    updateMotionHistory(dev, ms, mask, dev->last.valuators);
 | 
					    updateMotionHistory(dev, ms, mask, dev->last.valuators);
 | 
				
			||||||
    if (dev->u.master)
 | 
					    if (dev->u.master)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -1104,7 +1110,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
 | 
				
			||||||
    if (!pDev->enabled)
 | 
					    if (!pDev->enabled)
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!scr || !pDev->valuator)
 | 
					    if (!scr)
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (type)
 | 
					    switch (type)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue