Skip to content

Commit 5a81423

Browse files
committed
printk/console: Enhance the check for consoles using init memory
printk_late_init() is responsible for disabling boot consoles that use init memory. It checks the address of struct console for this. But this is not enough. For example, there are several early consoles that have write() method in the init section and struct console in the normal section. They are not disabled and could cause fancy and hard to debug system states. It is even more complicated by the macros EARLYCON_DECLARE() and OF_EARLYCON_DECLARE() where various struct members are set at runtime by the provided setup() function. I have tried to reproduce this problem and forced the classic uart early console to stay using keep_bootcon parameter. In particular I used earlycon=uart,io,0x3f8 keep_bootcon console=ttyS0,115200. The system did not boot: [ 1.570496] PM: Image not found (code -22) [ 1.570496] PM: Image not found (code -22) [ 1.571886] PM: Hibernation image not present or could not be loaded. [ 1.571886] PM: Hibernation image not present or could not be loaded. [ 1.576407] Freeing unused kernel memory: 2528K [ 1.577244] kernel tried to execute NX-protected page - exploit attempt? (uid: 0) The double lines are caused by having both early uart console and ttyS0 console enabled at the same time. The early console stopped working when the init memory was freed. Fortunately, the invalid call was caught by the NX-protexted page check and did not cause any silent fancy problems. This patch adds a check for many other addresses stored in struct console. It omits setup() and match() that are used only when the console is registered. Therefore they have already been used at this point and there is no reason to use them again. Link: http://lkml.kernel.org/r/[email protected] Cc: Steven Rostedt <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Matt Redfearn <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Jiri Slaby <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: Alan Cox <[email protected]> Cc: "Fabio M. Di Nitto" <[email protected]> Cc: [email protected] Cc: [email protected] Reviewed-by: Sergey Senozhatsky <[email protected]> Signed-off-by: Petr Mladek <[email protected]>
1 parent 2b1be68 commit 5a81423

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

kernel/printk/printk.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2659,8 +2659,16 @@ static int __init printk_late_init(void)
26592659
int ret;
26602660

26612661
for_each_console(con) {
2662-
if ((con->flags & CON_BOOT) &&
2663-
init_section_intersects(con, sizeof(*con))) {
2662+
if (!(con->flags & CON_BOOT))
2663+
continue;
2664+
2665+
/* Check addresses that might be used for enabled consoles. */
2666+
if (init_section_intersects(con, sizeof(*con)) ||
2667+
init_section_contains(con->write, 0) ||
2668+
init_section_contains(con->read, 0) ||
2669+
init_section_contains(con->device, 0) ||
2670+
init_section_contains(con->unblank, 0) ||
2671+
init_section_contains(con->data, 0)) {
26642672
/*
26652673
* Please, consider moving the reported consoles out
26662674
* of the init section.

0 commit comments

Comments
 (0)