tty, serial: Fix race and NULL check in uart_close()
Commit 46d57a449a
("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 <mingo@elte.hu>
Cc: Greg KH <gregkh@suse.de>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
d93a8f829f
Коммит
eea7e17e0e
|
@ -1270,6 +1270,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
|
||||||
|
|
||||||
BUG_ON(!kernel_locked());
|
BUG_ON(!kernel_locked());
|
||||||
|
|
||||||
|
if (!state)
|
||||||
|
return;
|
||||||
|
|
||||||
uport = state->uart_port;
|
uport = state->uart_port;
|
||||||
port = &state->port;
|
port = &state->port;
|
||||||
|
|
||||||
|
@ -1316,9 +1319,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
|
||||||
*/
|
*/
|
||||||
if (port->flags & ASYNC_INITIALIZED) {
|
if (port->flags & ASYNC_INITIALIZED) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&port->lock, flags);
|
spin_lock_irqsave(&uport->lock, flags);
|
||||||
uport->ops->stop_rx(uport);
|
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
|
* Before we drop DTR, make sure the UART transmitter
|
||||||
* has completely drained; this is especially
|
* has completely drained; this is especially
|
||||||
|
|
Загрузка…
Ссылка в новой задаче