lkml.org 
[lkml]   [2019]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 net-next 11/12] net: hns3: prevent double free in hns3_put_ring_config()
    Date
    This patch adds a check for the hns3_put_ring_config() to prevent
    double free, and for more readable, move the NULL assignment of
    priv->ring_data into the hns3_put_ring_config().

    Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
    Signed-off-by: Peng Li <lipeng321@huawei.com>
    ---
    drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    index 7dc281c..b0f31eb 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    @@ -3487,6 +3487,7 @@ static int hns3_get_ring_config(struct hns3_nic_priv *priv)
    }

    devm_kfree(&pdev->dev, priv->ring_data);
    + priv->ring_data = NULL;
    return ret;
    }

    @@ -3495,12 +3496,16 @@ static void hns3_put_ring_config(struct hns3_nic_priv *priv)
    struct hnae3_handle *h = priv->ae_handle;
    int i;

    + if (!priv->ring_data)
    + return;
    +
    for (i = 0; i < h->kinfo.num_tqps; i++) {
    devm_kfree(priv->dev, priv->ring_data[i].ring);
    devm_kfree(priv->dev,
    priv->ring_data[i + h->kinfo.num_tqps].ring);
    }
    devm_kfree(priv->dev, priv->ring_data);
    + priv->ring_data = NULL;
    }

    static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring)
    @@ -3920,8 +3925,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)

    hns3_dbg_uninit(handle);

    - priv->ring_data = NULL;
    -
    out_netdev_free:
    free_netdev(netdev);
    }
    @@ -4268,12 +4271,10 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
    hns3_uninit_all_ring(priv);
    err_uninit_vector:
    hns3_nic_uninit_vector_data(priv);
    - priv->ring_data = NULL;
    err_dealloc_vector:
    hns3_nic_dealloc_vector_data(priv);
    err_put_ring:
    hns3_put_ring_config(priv);
    - priv->ring_data = NULL;

    return ret;
    }
    @@ -4335,7 +4336,6 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
    netdev_err(netdev, "uninit ring error\n");

    hns3_put_ring_config(priv);
    - priv->ring_data = NULL;

    return ret;
    }
    --
    2.7.4
    \
     
     \ /
      Last update: 2019-04-24 13:09    [W:6.974 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site