lkml.org 
[lkml]   [2014]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 095/104] bnx2fc: fix memory leak in bnx2fc_allocate_hash_table()
    Date
    From: Maurizio Lombardi <mlombard@redhat.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit fdbcbcab0eae6773430546697ace0b3fe48e7fbc upstream.

    In case of error, the bnx2fc_allocate_hash_table() didn't free
    all the memory it allocated.

    Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
    Acked-by: Eddie Wai <eddie.wai@broadcom.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/scsi/bnx2fc/bnx2fc_hwi.c | 31 +++++++++++++++++++------------
    1 file changed, 19 insertions(+), 12 deletions(-)

    diff --git a/drivers/scsi/bnx2fc/bnx2fc_hwi.c b/drivers/scsi/bnx2fc/bnx2fc_hwi.c
    index 46a37657307f..f819cd17af75 100644
    --- a/drivers/scsi/bnx2fc/bnx2fc_hwi.c
    +++ b/drivers/scsi/bnx2fc/bnx2fc_hwi.c
    @@ -2023,7 +2023,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
    dma_segment_array = kzalloc(dma_segment_array_size, GFP_KERNEL);
    if (!dma_segment_array) {
    printk(KERN_ERR PFX "hash table pointers (dma) alloc failed\n");
    - return -ENOMEM;
    + goto cleanup_ht;
    }

    for (i = 0; i < segment_count; ++i) {
    @@ -2034,15 +2034,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
    GFP_KERNEL);
    if (!hba->hash_tbl_segments[i]) {
    printk(KERN_ERR PFX "hash segment alloc failed\n");
    - while (--i >= 0) {
    - dma_free_coherent(&hba->pcidev->dev,
    - BNX2FC_HASH_TBL_CHUNK_SIZE,
    - hba->hash_tbl_segments[i],
    - dma_segment_array[i]);
    - hba->hash_tbl_segments[i] = NULL;
    - }
    - kfree(dma_segment_array);
    - return -ENOMEM;
    + goto cleanup_dma;
    }
    memset(hba->hash_tbl_segments[i], 0,
    BNX2FC_HASH_TBL_CHUNK_SIZE);
    @@ -2054,8 +2046,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
    GFP_KERNEL);
    if (!hba->hash_tbl_pbl) {
    printk(KERN_ERR PFX "hash table pbl alloc failed\n");
    - kfree(dma_segment_array);
    - return -ENOMEM;
    + goto cleanup_dma;
    }
    memset(hba->hash_tbl_pbl, 0, PAGE_SIZE);

    @@ -2080,6 +2071,22 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
    }
    kfree(dma_segment_array);
    return 0;
    +
    +cleanup_dma:
    + for (i = 0; i < segment_count; ++i) {
    + if (hba->hash_tbl_segments[i])
    + dma_free_coherent(&hba->pcidev->dev,
    + BNX2FC_HASH_TBL_CHUNK_SIZE,
    + hba->hash_tbl_segments[i],
    + dma_segment_array[i]);
    + }
    +
    + kfree(dma_segment_array);
    +
    +cleanup_ht:
    + kfree(hba->hash_tbl_segments);
    + hba->hash_tbl_segments = NULL;
    + return -ENOMEM;
    }

    /**
    --
    2.0.4


    \
     
     \ /
      Last update: 2014-08-20 14:21    [W:4.536 / U:0.720 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site