diff options
author | Daeseok Youn <daeseok.youn@gmail.com> | 2014-05-29 18:11:09 +0900 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-06-19 15:19:06 -0700 |
commit | f86c55c9654da49d0bd401634cf679f410dfeb8d (patch) | |
tree | c935b5d501114141ebf4865cae716de9645a4cd2 /drivers/staging/dgap | |
parent | 836bf241d8062490698e9238e805f7847f3fb179 (diff) | |
download | lwn-f86c55c9654da49d0bd401634cf679f410dfeb8d.tar.gz lwn-f86c55c9654da49d0bd401634cf679f410dfeb8d.zip |
staging: dgap: unwind on error in dgap_found_board()
Adds a label for "kfree(brd)". And also remove
a state value as BOARD_FAILED in brd when dgap_do_remap() is failed.
Because "brd" will free after failure.
Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/dgap')
-rw-r--r-- | drivers/staging/dgap/dgap.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/staging/dgap/dgap.c b/drivers/staging/dgap/dgap.c index af78f6f057a9..5556a6ec8a12 100644 --- a/drivers/staging/dgap/dgap.c +++ b/drivers/staging/dgap/dgap.c @@ -673,6 +673,7 @@ static int dgap_found_board(struct pci_dev *pdev, int id) struct board_t *brd; unsigned int pci_irq; int i; + int ret; /* get the board structure and prep it */ brd = kzalloc(sizeof(struct board_t), GFP_KERNEL); @@ -728,8 +729,10 @@ static int dgap_found_board(struct pci_dev *pdev, int id) brd->membase_end = pci_resource_end(pdev, 0); } - if (!brd->membase) - return -ENODEV; + if (!brd->membase) { + ret = -ENODEV; + goto free_brd; + } if (brd->membase & 1) brd->membase &= ~3; @@ -770,14 +773,20 @@ static int dgap_found_board(struct pci_dev *pdev, int id) tasklet_init(&brd->helper_tasklet, dgap_poll_tasklet, (unsigned long) brd); - i = dgap_do_remap(brd); - if (i) - brd->state = BOARD_FAILED; + ret = dgap_do_remap(brd); + if (ret) + goto free_brd; pr_info("dgap: board %d: %s (rev %d), irq %ld\n", dgap_numboards, brd->name, brd->rev, brd->irq); return 0; + +free_brd: + kfree(brd); + dgap_board[dgap_numboards] = NULL; + + return ret; } |