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,18 +872,21 @@ 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; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Crossed screen? Scale back to device coordiantes */ |     if (dev->valuator) | ||||||
|     if(*screenx != old_screenx) |  | ||||||
|     { |     { | ||||||
|         scr = miPointerGetScreen(dev); |         /* Crossed screen? Scale back to device coordiantes */ | ||||||
|         *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL, |         if(*screenx != old_screenx) | ||||||
|                                 dev->valuator->axes + 0, scr->width); |         { | ||||||
|     } |             scr = miPointerGetScreen(dev); | ||||||
|     if(*screeny != old_screeny) |             *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL, | ||||||
|     { |                                     dev->valuator->axes + 0, scr->width); | ||||||
|         scr = miPointerGetScreen(dev); |         } | ||||||
|         *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL, |         if(*screeny != old_screeny) | ||||||
|                                  dev->valuator->axes + 1, scr->height); |         { | ||||||
|  |             scr = miPointerGetScreen(dev); | ||||||
|  |             *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL, | ||||||
|  |                                      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 */ | ||||||
|  | @ -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