lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 24 Feb 2022 05:40:33 +0100
From:   Lukas Wunner <lukas@...ner.de>
To:     Petr Mladek <pmladek@...e.com>,
        Sergey Senozhatsky <senozhatsky@...omium.org>
Cc:     Steven Rostedt <rostedt@...dmis.org>,
        John Ogness <john.ogness@...utronix.de>,
        Lino Sanfilippo <LinoSanfilippo@....de>,
        linux-kernel@...r.kernel.org
Subject: [PATCH for-6.4] printk: Unregister boot consoles on register of 1st
 real console

The code comment preceding register_console() claims that:

   "There are two types of consoles - bootconsoles (early_printk) and
    "real" consoles (everything which is not a bootconsole) which are
    handled differently. [...]
    As soon as a "real" console is registered, all bootconsoles
    will be unregistered automatically."

But that's not what the code does:  The code unregisters bootconsoles
only when the *preferred* console registers, i.e. the last one on the
command line.  If that console's driver never registers (e.g. because
it is disabled in the kernel config), bootconsoles stay around
indefinitely.  Should the command line contain both a bootconsole as
well as a real console on the same serial port, all messages are logged
twice once the real console registers.

Moreover, the log buffer is replayed once the real console registers
even though the messages were already emitted by the bootconsole.

Amend the code to be congruent with the above-quoted code comment and
thereby avoid these issues.

Signed-off-by: Lukas Wunner <lukas@...ner.de>
---
 kernel/printk/printk.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fd0c9f913940..f89e865c6b23 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -3423,10 +3423,8 @@ void register_console(struct console *newcon)
 	 * the real console are the same physical device, it's annoying to
 	 * see the beginning boot messages twice
 	 */
-	if (bootcon_registered &&
-	    ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) {
+	if (bootcon_registered && !(newcon->flags & CON_BOOT))
 		newcon->flags &= ~CON_PRINTBUFFER;
-	}
 
 	newcon->dropped = 0;
 	console_init_seq(newcon, bootcon_registered);
@@ -3465,8 +3463,7 @@ void register_console(struct console *newcon)
 	 * went to the bootconsole (that they do not see on the real console)
 	 */
 	con_printk(KERN_INFO, newcon, "enabled\n");
-	if (bootcon_registered &&
-	    ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
+	if (bootcon_registered && !(newcon->flags & CON_BOOT) &&
 	    !keep_bootcon) {
 		struct hlist_node *tmp;
 
-- 
2.39.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ