From 551a9d73942b0ffa6cb9fe3bb35936dcc7172281 Mon Sep 17 00:00:00 2001 From: Daeseok Youn Date: Mon, 2 Jun 2014 14:07:46 +0900 Subject: [PATCH] staging: dgap: unwind on error in dgap_tty_init() If the kzalloc() fails for channels, it need to handle that error. It should free channels which were already allocated. And also removes the call to dgap_tty_uninit() in dgap_firmware_load(). Signed-off-by: Daeseok Youn Signed-off-by: Greg Kroah-Hartman --- drivers/staging/dgap/dgap.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/staging/dgap/dgap.c b/drivers/staging/dgap/dgap.c index fcfa061cb5e2..8580f4bd229f 100644 --- a/drivers/staging/dgap/dgap.c +++ b/drivers/staging/dgap/dgap.c @@ -957,10 +957,8 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type) * Do tty device initialization. */ ret = dgap_tty_init(brd); - if (ret < 0) { - dgap_tty_uninit(brd); + if (ret < 0) return ret; - } ret = dgap_tty_register_ports(brd); if (ret) @@ -1330,6 +1328,7 @@ static int dgap_tty_init(struct board_t *brd) struct channel_t *ch; struct bs_t __iomem *bs; struct cm_t __iomem *cm; + int ret; if (!brd) return -EIO; @@ -1381,8 +1380,10 @@ static int dgap_tty_init(struct board_t *brd) for (i = 0; i < brd->nasync; i++) { brd->channels[i] = kzalloc(sizeof(struct channel_t), GFP_KERNEL); - if (!brd->channels[i]) - return -ENOMEM; + if (!brd->channels[i]) { + ret = -ENOMEM; + goto free_chan; + } } ch = brd->channels[0]; @@ -1478,6 +1479,13 @@ static int dgap_tty_init(struct board_t *brd) } return 0; + +free_chan: + while (--i >= 0) { + kfree(brd->channels[i]); + brd->channels[i] = NULL; + } + return ret; } /* -- 2.30.2