mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
printk: Handle pre-enabled consoles in the top-level register_console()
The function try_enable_preferred_console() currently has the non-obvious side effect of returning success for consoles that are already pre-enabled. This obscures the logic flow during console registration. Move the check for pre-enabled consoles directly into the top-level register_console(). This change makes the handling of pre-enabled consoles explicit and easier to follow. Furthermore, this separation lays the groundwork for future cleanups where try_enable_preferred_console() can be restricted to cases where an entry actually exists in the console_cmdline[] array. Also it fixes a possible out-of-bound access when the console_cmdline[] array is full and no console matched. In fact, the check of c->user_specified did not make much sense. The new console either matched and was handled in the for-cycle. Or it did not match and then *c pointed to an unused entry. Possible behavior change: try_enable_preferred_console() will newly be called also with @user_specified parameter set to "false" when it failed with the "true" variant. But it looks like the right way to do. It will allow to call newcon->setup() when the console was preferred by some platform specific code. Reported-by: Naveen Kumar Chaudhary <naveen.osdev@gmail.com> # out-of-bound access Closes: https://lore.kernel.org/r/7sq4tr2nmlz32tvkf6vpsghv6exvqfghsrlvywjcqihzsqqbf7@bspclmti5xg4 Reviewed-by: John Ogness <john.ogness@linutronix.de> Link: https://patch.msgid.link/20260604101459.393162-2-pmladek@suse.com Signed-off-by: Petr Mladek <pmladek@suse.com>
This commit is contained in:
parent
0db1496dcb
commit
3219f9b61d
|
|
@ -3890,9 +3890,6 @@ static int console_call_setup(struct console *newcon, char *options)
|
|||
* the newly registered console with any of the ones selected
|
||||
* by either the command line or add_preferred_console() and
|
||||
* setup/enable it.
|
||||
*
|
||||
* Care need to be taken with consoles that are statically
|
||||
* enabled such as netconsole
|
||||
*/
|
||||
static int try_enable_preferred_console(struct console *newcon,
|
||||
bool user_specified)
|
||||
|
|
@ -3933,14 +3930,6 @@ static int try_enable_preferred_console(struct console *newcon,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some consoles, such as pstore and netconsole, can be enabled even
|
||||
* without matching. Accept the pre-enabled consoles only when match()
|
||||
* and setup() had a chance to be called.
|
||||
*/
|
||||
if (newcon->flags & CON_ENABLED && c->user_specified == user_specified)
|
||||
return 0;
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
|
@ -4123,6 +4112,14 @@ void register_console(struct console *newcon)
|
|||
if (err == -ENOENT)
|
||||
err = try_enable_preferred_console(newcon, false);
|
||||
|
||||
/*
|
||||
* Some consoles, such as pstore and netconsole, can be enabled even
|
||||
* without matching. Accept them at this stage when they had a chance
|
||||
* to match() and call setup().
|
||||
*/
|
||||
if (err == -ENOENT && (newcon->flags & CON_ENABLED))
|
||||
err = 0;
|
||||
|
||||
/* printk() messages are not printed to the Braille console. */
|
||||
if (err || newcon->flags & CON_BRL) {
|
||||
if (newcon->flags & CON_NBCON)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user