| From 7b53330ee5a5e1fb1928c939b8c38ba6c4842db4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 5 Oct 2021 19:42:20 -0700 |
| Subject: gve: Avoid freeing NULL pointer |
| |
| From: Tao Liu <xliutaox@google.com> |
| |
| [ Upstream commit 922aa9bcac92b3ab6a423526a8e785b35a60b441 ] |
| |
| Prevent possible crashes when cleaning up after unsuccessful |
| initializations. |
| |
| Fixes: 893ce44df5658 ("gve: Add basic driver framework for Compute Engine Virtual NIC") |
| Signed-off-by: Tao Liu <xliutaox@google.com> |
| Signed-off-by: Catherine Sully <csully@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/google/gve/gve_main.c | 27 ++++++++++++++-------- |
| 1 file changed, 17 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c |
| index 0b714b606ba1..22b2c6a8d08f 100644 |
| --- a/drivers/net/ethernet/google/gve/gve_main.c |
| +++ b/drivers/net/ethernet/google/gve/gve_main.c |
| @@ -71,6 +71,9 @@ static int gve_alloc_counter_array(struct gve_priv *priv) |
| |
| static void gve_free_counter_array(struct gve_priv *priv) |
| { |
| + if (!priv->counter_array) |
| + return; |
| + |
| dma_free_coherent(&priv->pdev->dev, |
| priv->num_event_counters * |
| sizeof(*priv->counter_array), |
| @@ -131,6 +134,9 @@ static int gve_alloc_stats_report(struct gve_priv *priv) |
| |
| static void gve_free_stats_report(struct gve_priv *priv) |
| { |
| + if (!priv->stats_report) |
| + return; |
| + |
| del_timer_sync(&priv->stats_report_timer); |
| dma_free_coherent(&priv->pdev->dev, priv->stats_report_len, |
| priv->stats_report, priv->stats_report_bus); |
| @@ -301,18 +307,19 @@ static void gve_free_notify_blocks(struct gve_priv *priv) |
| { |
| int i; |
| |
| - if (priv->msix_vectors) { |
| - /* Free the irqs */ |
| - for (i = 0; i < priv->num_ntfy_blks; i++) { |
| - struct gve_notify_block *block = &priv->ntfy_blocks[i]; |
| - int msix_idx = i; |
| + if (!priv->msix_vectors) |
| + return; |
| |
| - irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, |
| - NULL); |
| - free_irq(priv->msix_vectors[msix_idx].vector, block); |
| - } |
| - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); |
| + /* Free the irqs */ |
| + for (i = 0; i < priv->num_ntfy_blks; i++) { |
| + struct gve_notify_block *block = &priv->ntfy_blocks[i]; |
| + int msix_idx = i; |
| + |
| + irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, |
| + NULL); |
| + free_irq(priv->msix_vectors[msix_idx].vector, block); |
| } |
| + free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); |
| dma_free_coherent(&priv->pdev->dev, |
| priv->num_ntfy_blks * sizeof(*priv->ntfy_blocks), |
| priv->ntfy_blocks, priv->ntfy_block_bus); |
| -- |
| 2.33.0 |
| |