]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2018 18:01:06 +0000 (10:01 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2018 18:01:06 +0000 (10:01 -0800)
added patches:
serial-core-mark-port-as-initialized-after-successful-irq-change.patch

queue-4.9/serial-core-mark-port-as-initialized-after-successful-irq-change.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/serial-core-mark-port-as-initialized-after-successful-irq-change.patch b/queue-4.9/serial-core-mark-port-as-initialized-after-successful-irq-change.patch
new file mode 100644 (file)
index 0000000..8752785
--- /dev/null
@@ -0,0 +1,43 @@
+From 44117a1d1732c513875d5a163f10d9adbe866c08 Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Thu, 11 Jan 2018 18:57:26 +0100
+Subject: serial: core: mark port as initialized after successful IRQ change
+
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+
+commit 44117a1d1732c513875d5a163f10d9adbe866c08 upstream.
+
+setserial changes the IRQ via uart_set_info(). It invokes
+uart_shutdown() which free the current used IRQ and clear
+TTY_PORT_INITIALIZED. It will then update the IRQ number and invoke
+uart_startup() before returning to the caller leaving
+TTY_PORT_INITIALIZED cleared.
+
+The next open will crash with
+|  list_add double add: new=ffffffff839fcc98, prev=ffffffff839fcc98, next=ffffffff839fcc98.
+since the close from the IOCTL won't free the IRQ (and clean the list)
+due to the TTY_PORT_INITIALIZED check in uart_shutdown().
+
+There is same pattern in uart_do_autoconfig() and I *think* it also
+needs to set TTY_PORT_INITIALIZED there.
+Is there a reason why uart_startup() does not set the flag by itself
+after the IRQ has been acquired (since it is cleared in uart_shutdown)?
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/tty/serial/serial_core.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/tty/serial/serial_core.c
++++ b/drivers/tty/serial/serial_core.c
+@@ -965,6 +965,8 @@ static int uart_set_info(struct tty_stru
+               }
+       } else {
+               retval = uart_startup(tty, state, 1);
++              if (retval == 0)
++                      tty_port_set_initialized(port, true);
+               if (retval > 0)
+                       retval = 0;
+       }
index 2b5d8cd9897a84ed8a4db16f823df2e0e9d6c44a..f6d225945cb37b31f996bca67e64addcc415f1e5 100644 (file)
@@ -15,3 +15,4 @@ asoc-pcm512x-add-missing-module_description-author-license.patch
 kaiser-fix-intel_bts-perf-crashes.patch
 x86-pti-make-unpoison-of-pgd-for-trusted-boot-work-for-real.patch
 kaiser-allocate-pgd-with-order-0-when-pti-off.patch
+serial-core-mark-port-as-initialized-after-successful-irq-change.patch