| From 8792ada29e29118ff4b6fa1569fec541987776eb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 May 2021 20:51:57 +0200 |
| Subject: tty: nozomi: Fix the error handling path of 'nozomi_card_init()' |
| |
| From: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| |
| [ Upstream commit 6ae7d0f5a92b9619f6e3c307ce56b2cefff3f0e9 ] |
| |
| The error handling path is broken and we may un-register things that have |
| never been registered. |
| |
| Update the loops index accordingly. |
| |
| Fixes: 9842c38e9176 ("kfifo: fix warn_unused_result") |
| Suggested-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| Link: https://lore.kernel.org/r/e28c2e92c7475da25b03d022ea2d6dcf1ba807a2.1621968629.git.christophe.jaillet@wanadoo.fr |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/tty/nozomi.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c |
| index 9a251a1b0d00..6890418a29a4 100644 |
| --- a/drivers/tty/nozomi.c |
| +++ b/drivers/tty/nozomi.c |
| @@ -1394,7 +1394,7 @@ static int nozomi_card_init(struct pci_dev *pdev, |
| NOZOMI_NAME, dc); |
| if (unlikely(ret)) { |
| dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq); |
| - goto err_free_kfifo; |
| + goto err_free_all_kfifo; |
| } |
| |
| DBG1("base_addr: %p", dc->base_addr); |
| @@ -1432,13 +1432,15 @@ static int nozomi_card_init(struct pci_dev *pdev, |
| return 0; |
| |
| err_free_tty: |
| - for (i = 0; i < MAX_PORT; ++i) { |
| + for (i--; i >= 0; i--) { |
| tty_unregister_device(ntty_driver, dc->index_start + i); |
| tty_port_destroy(&dc->port[i].port); |
| } |
| free_irq(pdev->irq, dc); |
| +err_free_all_kfifo: |
| + i = MAX_PORT; |
| err_free_kfifo: |
| - for (i = 0; i < MAX_PORT; i++) |
| + for (i--; i >= PORT_MDM; i--) |
| kfifo_free(&dc->port[i].fifo_ul); |
| err_free_sbuf: |
| kfree(dc->send_buf); |
| -- |
| 2.30.2 |
| |