On Fri, 2013-03-22 at 11:10 +0100, Andreas Bießmann wrote:
> This patch guards the console_drivers list to be corrupted. The
> for_each_console() macro insist on a strictly forward list ended by NULL:
> 
>  con0->next->con1->next->NULL
> 
> Without this patch it may happen easily to destroy this list for example by
> adding 'earlyprintk' twice. This will result in the following list:
> 
>  con0->next->con0
> 
> This in turn will result in an endless loop in console_unlock() later on by
> printing the first __log_buf line endlessly.
> 
> Signed-off-by: Andreas Bießmann <andr...@biessmann.de>
> Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
> Cc: Kay Sievers <k...@vrfy.org>
> Cc: sta...@vger.kernel.org
> ---
>  kernel/printk.c |    8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/kernel/printk.c b/kernel/printk.c
> index 0b31715..f78bfcd 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -2254,6 +2254,14 @@ void register_console(struct console *newcon)
>       unsigned long flags;
>       struct console *bcon = NULL;
>  
> +     if (console_drivers)
> +             for_each_console(bcon)
> +                     if (bcon == newcon) {
> +                             pr_warn("prevent adding console '%s%d' twice\n",
> +                                     newcon->name, newcon->index);

Since this is surely a bug in the calling driver, I think the warning
should be louder, i.e. use WARN.

Ben.

> +                             return;
> +                     }
> +
>       /*
>        * before we register a new CON_BOOT console, make sure we don't
>        * already have a valid console

-- 
Ben Hutchings
Make three consecutive correct guesses and you will be considered an expert.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to