diff options
author | Alan Cox <alan@linux.intel.com> | 2012-09-17 15:00:44 +0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-09-17 15:45:29 +0400 |
commit | 41fda9c4d9437846f4ca667e134c6d840f67b9c2 (patch) | |
tree | 0c52f074e3d0a49119a2f1903ada4ef862b275fd /drivers/tty/serial/max3100.c | |
parent | d83114e9754cf5deb3424217ff2f10cace1428e3 (diff) | |
download | linux-41fda9c4d9437846f4ca667e134c6d840f67b9c2.tar.xz |
tty: serial: max3100: Fix error case
We don't want to free a random address if the entry is wrong, cover
this and WARN if it ever happens.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/max3100.c')
-rw-r--r-- | drivers/tty/serial/max3100.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c index 46043c2521ce..0f24486be532 100644 --- a/drivers/tty/serial/max3100.c +++ b/drivers/tty/serial/max3100.c @@ -827,14 +827,16 @@ static int __devexit max3100_remove(struct spi_device *spi) /* find out the index for the chip we are removing */ for (i = 0; i < MAX_MAX3100; i++) - if (max3100s[i] == s) + if (max3100s[i] == s) { + dev_dbg(&spi->dev, "%s: removing port %d\n", __func__, i); + uart_remove_one_port(&max3100_uart_driver, &max3100s[i]->port); + kfree(max3100s[i]); + max3100s[i] = NULL; break; + } - dev_dbg(&spi->dev, "%s: removing port %d\n", __func__, i); - uart_remove_one_port(&max3100_uart_driver, &max3100s[i]->port); - kfree(max3100s[i]); - max3100s[i] = NULL; - + WARN_ON(i == MAX_MAX3100); + /* check if this is the last chip we have */ for (i = 0; i < MAX_MAX3100; i++) if (max3100s[i]) { |