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 <andreas@xxxxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: Kay Sievers <kay@xxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > --- > 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