summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch')
-rw-r--r--debian/patches-rt/0317-printk-ignore-consoles-without-write-callback.patch50
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
+