summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Engraf <david.engraf@sysgo.com>2026-09-24 10:00:57 +0300
committerPetr Mladek <pmladek@suse.com>2026-10-02 16:39:35 +0200
commitb80fc54890d44cd35360ca122b72224fe78061bf (patch)
tree2bee6e262909c26d8eab67ef4c533708ab9b4dbb
parentae30792e536c80aed87fb11ec9140e55ed99da09 (diff)
downloadlinux-next-b80fc54890d44cd35360ca122b72224fe78061bf.tar.gz
linux-next-b80fc54890d44cd35360ca122b72224fe78061bf.zip
printk: Remove console options before decoding the name
This fixes a regression when a console option includes ':'. Commit 7640f1a44eba ("printk: Add match_devname_and_update_preferred_console()") introduced console=DEVNAME:0.0 hardware style addressing by looking for a colon. If the colon is part of an option the name is handled as devname instead of ttyname. Fix by handling the options first which will add a NULL terminator to the string. Note that parsing the options first means that also idx parsing needs changing. Handle the idx parsing by refactoring the code (thanks to Petr Mladek). Signed-off-by: David Engraf <david.engraf@sysgo.com> Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com> Reviewed-by: Petr Mladek <pmladek@suse.com> Reviewed-by: John Ogness <john.ogness@linutronix.de> Link: https://patch.msgid.link/20260924070153.250783-2-david.engraf@sysgo.com [pmladek@suse.com: Updated the commit message as suggested by Tony Lindgren] Signed-off-by: Petr Mladek <pmladek@suse.com>
-rw-r--r--kernel/printk/printk.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 45c3cfc28e78..9070f20230bb 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2646,24 +2646,25 @@ static int __init console_setup(char *str)
if (_braille_console_setup(&str, &brl_options))
return 1;
+ /*
+ * Decode str into name, index and options. Start with options, since
+ * it might also contain a ':' used for DEVNAME.
+ */
+ options = strchr(str, ',');
+ if (options)
+ *(options++) = 0;
+
/* For a DEVNAME:0.0 style console the character device is unknown early */
if (strchr(str, ':'))
devname = buf;
else
ttyname = buf;
- /*
- * Decode str into name, index, options.
- */
if (ttyname && isdigit(str[0]))
scnprintf(buf, sizeof(buf), "ttyS%s", str);
else
strscpy(buf, str);
- options = strchr(str, ',');
- if (options)
- *(options++) = 0;
-
#ifdef __sparc__
if (!strcmp(str, "ttya"))
strscpy(buf, "ttyS0");
@@ -2671,17 +2672,18 @@ static int __init console_setup(char *str)
strscpy(buf, "ttyS1");
#endif
- for (s = buf; *s; s++)
- if ((ttyname && isdigit(*s)) || *s == ',')
- break;
-
- /* @idx will get defined when devname matches. */
- if (devname)
- idx = -1;
- else
+ if (ttyname) {
+ /* Detect @idx in ttyname and remove it. */
+ for (s = ttyname; *s; s++) {
+ if (isdigit(*s))
+ break;
+ }
idx = simple_strtoul(s, NULL, 10);
-
- *s = 0;
+ *s = 0;
+ } else {
+ /* @idx will get defined when devname matches. */
+ idx = -1;
+ }
__add_preferred_console(ttyname, idx, devname, options, brl_options, true);
return 1;