cmdline: parse multiple instances of the vga option

Parse all instances of the vga= option on the command line, in order
to always enforce the last selection on the command line.

Note that it's not safe to parse just the last occurrence of the vga=
option, as then a command line with `vga=current vga=keep` would
result in current being ignored.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2023-07-10 12:19:03 +02:00
1 parent 60474e8e28
commit 9473d9a241
1 file changed
+42 -41
+42 -41
View File
@@ -277,59 +277,60 @@ static u16 rows2vmode(unsigned int rows)
static void vga_parse(const char *cmdline, early_boot_opts_t *ebo)
{
const char *c;
unsigned int tmp, vesa_depth, vesa_height, vesa_width;
c = find_opt(cmdline, "vga=", true);
if ( !c )
return;
const char *c = cmdline;
ebo->boot_vid_mode = ASK_VGA;
if ( !strmaxcmp(c, "current", delim_chars_comma) )
ebo->boot_vid_mode = VIDEO_CURRENT_MODE;
else if ( !strsubcmp(c, "text-80x") )
while ( (c = find_opt(c, "vga=", true)) != NULL )
{
c += strlen("text-80x");
ebo->boot_vid_mode = rows2vmode(strtoui(c, delim_chars_comma, NULL));
}
else if ( !strsubcmp(c, "gfx-") )
{
vesa_width = strtoui(c + strlen("gfx-"), "x", &c);
unsigned int tmp, vesa_depth, vesa_height, vesa_width;
if ( vesa_width > U16_MAX )
return;
if ( !strmaxcmp(c, "current", delim_chars_comma) )
ebo->boot_vid_mode = VIDEO_CURRENT_MODE;
else if ( !strsubcmp(c, "text-80x") )
{
c += strlen("text-80x");
ebo->boot_vid_mode = rows2vmode(strtoui(c, delim_chars_comma, NULL));
}
else if ( !strsubcmp(c, "gfx-") )
{
vesa_width = strtoui(c + strlen("gfx-"), "x", &c);
/*
* Increment c outside of strtoui() because otherwise some
* compiler may complain with following message:
* warning: operation on 'c' may be undefined.
*/
++c;
vesa_height = strtoui(c, "x", &c);
if ( vesa_width > U16_MAX )
return;
if ( vesa_height > U16_MAX )
return;
/*
* Increment c outside of strtoui() because otherwise some
* compiler may complain with following message:
* warning: operation on 'c' may be undefined.
*/
++c;
vesa_height = strtoui(c, "x", &c);
vesa_depth = strtoui(++c, delim_chars_comma, NULL);
if ( vesa_height > U16_MAX )
return;
if ( vesa_depth > U16_MAX )
return;
vesa_depth = strtoui(++c, delim_chars_comma, NULL);
ebo->vesa_width = vesa_width;
ebo->vesa_height = vesa_height;
ebo->vesa_depth = vesa_depth;
ebo->boot_vid_mode = VIDEO_VESA_BY_SIZE;
}
else if ( !strsubcmp(c, "mode-") )
{
tmp = strtoui(c + strlen("mode-"), delim_chars_comma, NULL);
if ( vesa_depth > U16_MAX )
return;
if ( tmp > U16_MAX )
return;
ebo->vesa_width = vesa_width;
ebo->vesa_height = vesa_height;
ebo->vesa_depth = vesa_depth;
ebo->boot_vid_mode = VIDEO_VESA_BY_SIZE;
}
else if ( !strsubcmp(c, "mode-") )
{
tmp = strtoui(c + strlen("mode-"), delim_chars_comma, NULL);
ebo->boot_vid_mode = tmp;
if ( tmp > U16_MAX )
return;
ebo->boot_vid_mode = tmp;
}
else if ( !strmaxcmp(c, "ask", delim_chars_comma) )
ebo->boot_vid_mode = ASK_VGA;
}
}
#endif
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.