forked from mirrors/linux
		
	drm/uapi: Validate the mode flags/type
Currently userspace is allowed to feed in any king of garbage in the high bits of the mode flags/type, as are drivers when probing modes. Reject any mode with bogus flags/type. Hopefully this won't break any current userspace... v2: Split the type and flags checks to separates ifs (Chris) Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jose Abreu <Jose.Abreu@synopsys.com> Cc: Adam Jackson <ajax@redhat.com> Cc: Keith Packard <keithp@keithp.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171115154913.23827-1-ville.syrjala@linux.intel.com Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									064a3e6e8e
								
							
						
					
					
						commit
						c6ed6dad5c
					
				
					 2 changed files with 30 additions and 0 deletions
				
			
		|  | @ -1036,6 +1036,12 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); | |||
| enum drm_mode_status | ||||
| drm_mode_validate_basic(const struct drm_display_mode *mode) | ||||
| { | ||||
| 	if (mode->type & ~DRM_MODE_TYPE_ALL) | ||||
| 		return MODE_BAD; | ||||
| 
 | ||||
| 	if (mode->flags & ~DRM_MODE_FLAG_ALL) | ||||
| 		return MODE_BAD; | ||||
| 
 | ||||
| 	if ((mode->flags & DRM_MODE_FLAG_3D_MASK) > DRM_MODE_FLAG_3D_MAX) | ||||
| 		return MODE_BAD; | ||||
| 
 | ||||
|  |  | |||
|  | @ -46,6 +46,14 @@ extern "C" { | |||
| #define DRM_MODE_TYPE_USERDEF	(1<<5) | ||||
| #define DRM_MODE_TYPE_DRIVER	(1<<6) | ||||
| 
 | ||||
| #define DRM_MODE_TYPE_ALL	(DRM_MODE_TYPE_BUILTIN |	\ | ||||
| 				 DRM_MODE_TYPE_CLOCK_C |	\ | ||||
| 				 DRM_MODE_TYPE_CRTC_C |		\ | ||||
| 				 DRM_MODE_TYPE_PREFERRED |	\ | ||||
| 				 DRM_MODE_TYPE_DEFAULT |	\ | ||||
| 				 DRM_MODE_TYPE_USERDEF |	\ | ||||
| 				 DRM_MODE_TYPE_DRIVER) | ||||
| 
 | ||||
| /* Video mode flags */ | ||||
| /* bit compatible with the xrandr RR_ definitions (bits 0-13)
 | ||||
|  * | ||||
|  | @ -99,6 +107,22 @@ extern "C" { | |||
| #define  DRM_MODE_FLAG_PIC_AR_16_9 \ | ||||
| 			(DRM_MODE_PICTURE_ASPECT_16_9<<19) | ||||
| 
 | ||||
| #define  DRM_MODE_FLAG_ALL	(DRM_MODE_FLAG_PHSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_NHSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_PVSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_NVSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_INTERLACE |	\ | ||||
| 				 DRM_MODE_FLAG_DBLSCAN |	\ | ||||
| 				 DRM_MODE_FLAG_CSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_PCSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_NCSYNC |		\ | ||||
| 				 DRM_MODE_FLAG_HSKEW |		\ | ||||
| 				 DRM_MODE_FLAG_BCAST |		\ | ||||
| 				 DRM_MODE_FLAG_PIXMUX |		\ | ||||
| 				 DRM_MODE_FLAG_DBLCLK |		\ | ||||
| 				 DRM_MODE_FLAG_CLKDIV2 |	\ | ||||
| 				 DRM_MODE_FLAG_3D_MASK) | ||||
| 
 | ||||
| /* DPMS flags */ | ||||
| /* bit compatible with the xorg definitions. */ | ||||
| #define DRM_MODE_DPMS_ON	0 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Ville Syrjälä
						Ville Syrjälä