Commit 37641379 authored by Maxime Ripard's avatar Maxime Ripard Committed by Maxime Ripard

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: default avatarMaxime Ripard <maxime.ripard@bootlin.com>
Tested-by: default avatarThomas Graichen <thomas.graichen@gmail.com>
Reviewed-by: default avatarJernej Skrabec <jernej.skrabec@siol.net>
Signed-off-by: default avatarMaxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190827115850.25731-3-mripard@kernel.org
parent 728a257f
...@@ -1677,6 +1677,22 @@ static int drm_mode_parse_cmdline_options(char *str, size_t len, ...@@ -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, ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment