From 86e5319371e31d0dd10ad64a03b12452f000473e Mon Sep 17 00:00:00 2001 From: John Ogness Date: Sun, 17 Feb 2019 03:11:20 +0100 Subject: [PATCH 039/298] printk: only allow kernel to emergency message Emergency messages exist as a mechanism for the kernel to communicate critical information to users. It is not meant for use by userspace. Only allow facility=0 messages to be processed by the emergency message code. Signed-off-by: John Ogness Signed-off-by: Sebastian Andrzej Siewior --- kernel/printk/printk.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 75fd873c473d..2ee769aeff08 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1688,7 +1688,8 @@ static void printk_write_history(struct console *con, u64 master_seq) * The console_lock must be held. */ static void call_console_drivers(u64 seq, const char *ext_text, size_t ext_len, - const char *text, size_t len, int level) + const char *text, size_t len, int level, + int facility) { struct console *con; @@ -1708,13 +1709,14 @@ static void call_console_drivers(u64 seq, const char *ext_text, size_t ext_len, con->wrote_history = 1; con->printk_seq = seq - 1; } - if (con->write_atomic && level < emergency_console_loglevel) { + if (con->write_atomic && level < emergency_console_loglevel && + facility == 0) { /* skip emergency messages, already printed */ if (con->printk_seq < seq) con->printk_seq = seq; continue; } - if (con->flags & CON_BOOT) { + if (con->flags & CON_BOOT && facility == 0) { /* skip emergency messages, already printed */ if (con->printk_seq < seq) con->printk_seq = seq; @@ -1882,7 +1884,11 @@ asmlinkage int vprintk_emit(int facility, int level, * - text points to beginning of text * - there is room before text for prefix */ - printk_emergency(rbuf, level & 7, ts_nsec, cpu, text, text_len); + if (facility == 0) { + /* only the kernel can create emergency messages */ + printk_emergency(rbuf, level & 7, ts_nsec, cpu, + text, text_len); + } if ((lflags & LOG_CONT) || !(lflags & LOG_NEWLINE)) { cont_add(ctx, cpu, facility, level, lflags, text, text_len); @@ -2645,8 +2651,8 @@ static int printk_kthread_func(void *data) &len, printk_time); console_lock(); - call_console_drivers(master_seq, ext_text, - ext_len, text, len, msg->level); + call_console_drivers(master_seq, ext_text, ext_len, text, len, + msg->level, msg->facility); if (len > 0 || ext_len > 0) printk_delay(msg->level); console_unlock(); -- 2.19.1