Messages in this thread Patch in this message | | | Date | Mon, 2 Jun 2014 14:06:15 +0900 | From | Daeseok Youn <> | Subject | [PATCH 2/6 RESEND] 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> --- RESEND: this patch is included into newly series of patches.
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 af78f6f..5556a6e 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; } -- 1.7.1
| |