diff options
author | Daeseok Youn <daeseok.youn@gmail.com> | 2014-06-02 09:07:46 +0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-06-20 02:21:47 +0400 |
commit | 551a9d73942b0ffa6cb9fe3bb35936dcc7172281 (patch) | |
tree | 511dec71c8a10495ddb0fd3726faa5ef118e5f5a /drivers/staging/dgap | |
parent | e74c2ddcbbc3ecfc55c246b3da3c5320fe46d8e3 (diff) | |
download | linux-551a9d73942b0ffa6cb9fe3bb35936dcc7172281.tar.xz |
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 <daeseok.youn@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/dgap')
-rw-r--r-- | drivers/staging/dgap/dgap.c | 18 |
1 files 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; } /* |