Skip to content

Commit cce7fc8

Browse files
andy-shevgregkh
authored andcommitted
serial: 8250_port: Check IRQ data before use
In case the leaf driver wants to use IRQ polling (irq = 0) and IIR register shows that an interrupt happened in the 8250 hardware the IRQ data can be NULL. In such a case we need to skip the wake event as we came to this path from the timer interrupt and quite likely system is already awake. Without this fix we have got an Oops: serial8250: ttyS0 at I/O 0x3f8 (irq = 0, base_baud = 115200) is a 16550A ... BUG: kernel NULL pointer dereference, address: 0000000000000010 RIP: 0010:serial8250_handle_irq+0x7c/0x240 Call Trace: ? serial8250_handle_irq+0x7c/0x240 ? __pfx_serial8250_timeout+0x10/0x10 Fixes: 0ba9e3a ("serial: 8250: Add missing wakeup event reporting") Cc: stable <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent ce9ecca commit cce7fc8

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/tty/serial/8250/8250_port.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1936,7 +1936,10 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
19361936
skip_rx = true;
19371937

19381938
if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
1939-
if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
1939+
struct irq_data *d;
1940+
1941+
d = irq_get_irq_data(port->irq);
1942+
if (d && irqd_is_wakeup_set(d))
19401943
pm_wakeup_event(tport->tty->dev, 0);
19411944
if (!up->dma || handle_rx_dma(up, iir))
19421945
status = serial8250_rx_chars(up, status);

0 commit comments

Comments
 (0)