serial: 8250_fintek: Fix potential NULL pointer dereference
PATCH 1/1 serial: 8250_fintek: Fix potential NULL pointer dereference
Fix potential NULL pointer dereference on
'commit 4da22f1418cb ("serial: 8250_fintek: fix the mismatched IRQ mode")'
We try to fix IRQ mode mismatch issue and add the following code to detect IRQ Level or Edge mode.
struct irq_data *irq_data = irq_get_irq_data(uart->port.irq); bool level_mode = irqd_is_level_type(irq_data);
But *irq_data had not any check and pass to irqd_is_level_type(), it may lead to potential NULL pointer dereference.
Also modify detecting IRQ mode when fintek chip found.
--- drivers/tty/serial/8250/8250_fintek.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/tty/serial/8250/8250_fintek.c +11 -2
@@ -212,8 +212,8 @@ int fintek_8250_probe(struct uart_8250_port *uart) {struct fintek_8250 *pdata;struct fintek_8250 probe_data; -struct irq_data *irq_data =irq_get_irq_data (uart->port.irq); -bool level_mode =irqd_is_level_type (irq_data); +struct irq_data *irq_data; +bool level_mode = false;/* Default to Edge/High */ if (find_base_port (&probe_data, uart->port.iobase))return -ENODEV ;
@@ -226,5 +226,14 @@ int fintek_8250_probe(struct uart_8250_port *uart) uart->port.rs485_config = fintek_8250_rs485_config; uart->port.private_data = pdata; + irq_data =irq_get_irq_data (uart->port.irq); +if (irq_data) { + level_mode =irqd_is_level_type (irq_data); + }else { +dev_warn (uart->port.dev, +"%s: Can't get irq_data, set this port to Edge/High" , + __func__); + } +return fintek_8250_set_irq_mode (pdata, level_mode); }
Signature · 1 line
1.9.1
Hi Peter
Somehow this patch entered my mail limbo. Sorry about that.
Could you remove the brackets on the if/else? I think that for one liners they are not recommended.
Also, I think it might be a good a idea to remove the __func__ from the dev_warn.
Best regards!
Quoted 53 lines · Ji-Ze Hong (Peter Hong)
Fix potential NULL pointer dereference on
'commit4da22f1418cb("serial: 8250_fintek: fix the mismatched IRQ mode")'We try to fix IRQ mode mismatch issue and add the following code to detect IRQ Level or Edge mode.
struct
irq_data*irq_data=irq_get_irq_data(uart->port.irq); boollevel_mode=irqd_is_level_type(irq_data);But
*irq_datahad not any check and pass toirqd_is_level_type(), it may lead to potential NULL pointer dereference.Also modify detecting IRQ mode when fintek chip found.
Suggested-by Ricardo Ribalda Delgado <[email protected]>Signed-off-by Ji-Ze Hong (Peter Hong) <[email protected]>--- drivers/tty/serial/8250/8250_fintek.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)drivers/tty/serial/8250/8250_fintek.c +11
-3@@ -212,8 +212,8 @@ int fintek_8250_probe(struct uart_8250_port *uart) {struct fintek_8250 *pdata;struct fintek_8250 probe_data; -struct irq_data *irq_data =irq_get_irq_data (uart->port.irq); -bool level_mode =irqd_is_level_type (irq_data); +struct irq_data *irq_data; +bool level_mode = false;/* Default to Edge/High */ if (find_base_port (&probe_data, uart->port.iobase))return -ENODEV ;@@ -226,5 +226,14 @@ int fintek_8250_probe(struct uart_8250_port *uart) uart->port.rs485_config = fintek_8250_rs485_config; uart->port.private_data = pdata; + irq_data =irq_get_irq_data (uart->port.irq); +if (irq_data) { + level_mode =irqd_is_level_type (irq_data); + }else { +dev_warn (uart->port.dev, +"%s: Can't get irq_data, set this port to Edge/High" , + __func__); + } +return fintek_8250_set_irq_mode (pdata, level_mode); } --1.9.1
Signature · 1 line
Ricardo Ribalda