diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-12 13:13:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-12 13:21:33 -0400 |
commit | eea7e17e0eb23729d58368420659f8e7c357d82e (patch) | |
tree | 728565e8a1f01d89dda17dff00a401915378a508 /drivers/serial | |
parent | d93a8f829fe1d2f3002f2c6ddb553d12db420412 (diff) |
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 <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>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/serial_core.c | 7 |
1 files changed, 5 insertions, 2 deletions
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) | |||
1270 | 1270 | ||
1271 | BUG_ON(!kernel_locked()); | 1271 | BUG_ON(!kernel_locked()); |
1272 | 1272 | ||
1273 | if (!state) | ||
1274 | return; | ||
1275 | |||
1273 | uport = state->uart_port; | 1276 | uport = state->uart_port; |
1274 | port = &state->port; | 1277 | port = &state->port; |
1275 | 1278 | ||
@@ -1316,9 +1319,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp) | |||
1316 | */ | 1319 | */ |
1317 | if (port->flags & ASYNC_INITIALIZED) { | 1320 | if (port->flags & ASYNC_INITIALIZED) { |
1318 | unsigned long flags; | 1321 | unsigned long flags; |
1319 | spin_lock_irqsave(&port->lock, flags); | 1322 | spin_lock_irqsave(&uport->lock, flags); |
1320 | uport->ops->stop_rx(uport); | 1323 | uport->ops->stop_rx(uport); |
1321 | spin_unlock_irqrestore(&port->lock, flags); | 1324 | spin_unlock_irqrestore(&uport->lock, flags); |
1322 | /* | 1325 | /* |
1323 | * Before we drop DTR, make sure the UART transmitter | 1326 | * Before we drop DTR, make sure the UART transmitter |
1324 | * has completely drained; this is especially | 1327 | * has completely drained; this is especially |