mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm/modes: Introduce a whitelist for the named modes
The named modes support has introduced a number of glitches that were in part due to the fact that the parser will take any string as a named mode. Since we shouldn't have a lot of options there (and they should be pretty standard), let's introduce a whitelist of the available named modes so that the kernel can differentiate between a poorly formed command line and a named mode. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Tested-by: Thomas Graichen <thomas.graichen@gmail.com> Reviewed-by: Jernej Skrabec <jernej.skrabec@siol.net> Signed-off-by: Maxime Ripard <mripard@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20190827115850.25731-3-mripard@kernel.org
This commit is contained in:
		
							parent
							
								
									728a257f65
								
							
						
					
					
						commit
						3764137906
					
				
					 1 changed files with 20 additions and 0 deletions
				
			
		| 
						 | 
					@ -1677,6 +1677,22 @@ static int drm_mode_parse_cmdline_options(char *str, size_t len,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *drm_named_modes_whitelist[] = {
 | 
				
			||||||
 | 
						"NTSC",
 | 
				
			||||||
 | 
						"PAL",
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool drm_named_mode_is_in_whitelist(const char *mode, unsigned int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < ARRAY_SIZE(drm_named_modes_whitelist); i++)
 | 
				
			||||||
 | 
							if (!strncmp(mode, drm_named_modes_whitelist[i], size))
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * drm_mode_parse_command_line_for_connector - parse command line modeline for connector
 | 
					 * drm_mode_parse_command_line_for_connector - parse command line modeline for connector
 | 
				
			||||||
 * @mode_option: optional per connector mode option
 | 
					 * @mode_option: optional per connector mode option
 | 
				
			||||||
| 
						 | 
					@ -1794,6 +1810,10 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
 | 
				
			||||||
	if (named_mode) {
 | 
						if (named_mode) {
 | 
				
			||||||
		if (mode_end + 1 > DRM_DISPLAY_MODE_LEN)
 | 
							if (mode_end + 1 > DRM_DISPLAY_MODE_LEN)
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!drm_named_mode_is_in_whitelist(name, mode_end))
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		strscpy(mode->name, name, mode_end + 1);
 | 
							strscpy(mode->name, name, mode_end + 1);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		ret = drm_mode_parse_cmdline_res_mode(name, mode_end,
 | 
							ret = drm_mode_parse_cmdline_res_mode(name, mode_end,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue