diff options
Diffstat (limited to '')
-rw-r--r-- | debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch b/debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch new file mode 100644 index 000000000..a0942062a --- /dev/null +++ b/debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch @@ -0,0 +1,50 @@ +From 7efd125170f344b124a00390d8d7b714beac1698 Mon Sep 17 00:00:00 2001 +From: John Ogness <john.ogness@linutronix.de> +Date: Fri, 17 Feb 2023 09:53:44 +0106 +Subject: [PATCH 317/323] printk: ignore consoles without write() callback +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz + +The ttynull driver does not provide an implementation for the write() +callback. This leads to a NULL pointer dereference in the related +printing kthread, which assumes it can call that callback. + +Do not create kthreads for consoles that do not implement the write() +callback. Also, for pr_flush(), ignore consoles that do not implement +write() or write_atomic(), since there is no way those consoles can +flush their output. + +Link: https://lore.kernel.org/lkml/1831554214.546921.1676479103702.JavaMail.zimbra@hale.at +Reported-by: Michael Thalmeier <michael.thalmeier@hale.at> +Signed-off-by: John Ogness <john.ogness@linutronix.de> +Signed-off-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com> +--- + kernel/printk/printk.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index d2205872304d..64747c72fbea 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -2267,6 +2267,10 @@ static int printk_kthread_func(void *data) + /* Must be called within console_lock(). */ + static void start_printk_kthread(struct console *con) + { ++ /* No need to start a printing thread if the console cannot print. */ ++ if (!con->write) ++ return; ++ + con->thread = kthread_run(printk_kthread_func, con, + "pr/%s%d", con->name, con->index); + if (IS_ERR(con->thread)) { +@@ -3566,6 +3570,8 @@ bool pr_flush(int timeout_ms, bool reset_on_progress) + for_each_console(con) { + if (!(con->flags & CON_ENABLED)) + continue; ++ if (!con->write && !con->write_atomic) ++ continue; + printk_seq = atomic64_read(&con->printk_seq); + if (printk_seq < seq) + diff += seq - printk_seq; +-- +2.43.0 + |