We need to take console_sem lock when we iterate console
drivers list. Otherwise, another CPU can concurrently
modify console drivers list or console drivers.

Signed-off-by: Sergey Senozhatsky <[email protected]>
---
 kernel/printk/printk.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index b0e361ca1bea..c2bccf58d03e 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2674,12 +2674,17 @@ void register_console(struct console *newcon)
        struct console_cmdline *c;
        static bool has_preferred;
 
-       if (console_drivers)
-               for_each_console(bcon)
-                       if (WARN(bcon == newcon,
-                                       "console '%s%d' already registered\n",
-                                       bcon->name, bcon->index))
-                               return;
+       console_lock();
+       if (console_drivers) {
+               for_each_console(bcon) {
+                       if (bcon != newcon)
+                               continue;
+                       WARN(1, "console '%s%d' already registered\n",
+                            bcon->name, bcon->index);
+                       console_unlock();
+                       return;
+               }
+       }
 
        /*
         * before we register a new CON_BOOT console, make sure we don't
@@ -2691,6 +2696,7 @@ void register_console(struct console *newcon)
                        if (!(bcon->flags & CON_BOOT)) {
                                pr_info("Too late to register bootconsole 
%s%d\n",
                                        newcon->name, newcon->index);
+                               console_unlock();
                                return;
                        }
                }
@@ -2701,6 +2707,7 @@ void register_console(struct console *newcon)
 
        if (!has_preferred || bcon || !console_drivers)
                has_preferred = preferred_console >= 0;
+       console_unlock();
 
        /*
         *      See if we want to use this console driver. If we
-- 
2.21.0

Reply via email to