From: Linus Torvalds Date: Mon, 12 Oct 2009 17:13:54 +0000 (+0200) Subject: tty, serial: Fix race and NULL check in uart_close() X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=eea7e17e0eb23729d58368420659f8e7c357d82e;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git tty, serial: Fix race and NULL check in uart_close() Commit 46d57a449aa1 ("serial: use tty_port pointers in the core code") contained two bugs that causes (rare) crashes: - the rename typoed one site - a NULL check was missed Reported-and-tested-by: Ingo Molnar Cc: Greg KH Cc: Alan Cox Signed-off-by: Ingo Molnar Signed-off-by: Linus Torvalds --- diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 1689bda1d13b..dcc72444e8e7 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -1270,6 +1270,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp) BUG_ON(!kernel_locked()); + if (!state) + return; + uport = state->uart_port; port = &state->port; @@ -1316,9 +1319,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp) */ if (port->flags & ASYNC_INITIALIZED) { unsigned long flags; - spin_lock_irqsave(&port->lock, flags); + spin_lock_irqsave(&uport->lock, flags); uport->ops->stop_rx(uport); - spin_unlock_irqrestore(&port->lock, flags); + spin_unlock_irqrestore(&uport->lock, flags); /* * Before we drop DTR, make sure the UART transmitter * has completely drained; this is especially