Commit 89efbe70 authored by Lukas Wunner's avatar Lukas Wunner Committed by Greg Kroah-Hartman

serial: pl011: Don't leak amba_ports entry on driver register error

pl011_probe() calls pl011_setup_port() to reserve an amba_ports[] entry,
then calls pl011_register_port() to register the uart driver with the
tty layer.

If registration of the uart driver fails, the amba_ports[] entry is not
released.  If this happens 14 times (value of UART_NR macro), then all
amba_ports[] entries will have been leaked and driver probing is no
longer possible.  (To be fair, that can only happen if the DeviceTree
doesn't contain alias IDs since they cause the same entry to be used for
a given port.)   Fix it.

Fixes: ef2889f7 ("serial: pl011: Move uart_register_driver call to device")
Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v3.15+
Cc: Tushar Behera <tushar.behera@linaro.org>
Link: https://lore.kernel.org/r/138f8c15afb2f184d8102583f8301575566064a6.1597316167.git.lukas@wunner.deSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c6b9e95d
...@@ -2615,7 +2615,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap, ...@@ -2615,7 +2615,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,
static int pl011_register_port(struct uart_amba_port *uap) static int pl011_register_port(struct uart_amba_port *uap)
{ {
int ret; int ret, i;
/* Ensure interrupts from this UART are masked and cleared */ /* Ensure interrupts from this UART are masked and cleared */
pl011_write(0, uap, REG_IMSC); pl011_write(0, uap, REG_IMSC);
...@@ -2626,6 +2626,9 @@ static int pl011_register_port(struct uart_amba_port *uap) ...@@ -2626,6 +2626,9 @@ static int pl011_register_port(struct uart_amba_port *uap)
if (ret < 0) { if (ret < 0) {
dev_err(uap->port.dev, dev_err(uap->port.dev,
"Failed to register AMBA-PL011 driver\n"); "Failed to register AMBA-PL011 driver\n");
for (i = 0; i < ARRAY_SIZE(amba_ports); i++)
if (amba_ports[i] == uap)
amba_ports[i] = NULL;
return ret; return ret;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment