Skip to content

Commit

Permalink
be2net: Free/delete pmacs (in be_clear()) only if they exist
Browse files Browse the repository at this point in the history
During suspend-resume and lancer error recovery we will cleanup and
re-initialize the resources through be_clear() and be_setup() respectively.
During re-initialisation in be_setup(), if be_get_config() fails, we'll again
call be_clear() which will cause a NULL pointer dereference as adapter->pmac_id is
already freed.

Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com>
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Somnath Kotur authored and David S. Miller committed Dec 6, 2013
1 parent 4bebb56 commit b05004a
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2940,28 +2940,35 @@ static void be_cancel_worker(struct be_adapter *adapter)
}
}

static int be_clear(struct be_adapter *adapter)
static void be_mac_clear(struct be_adapter *adapter)
{
int i;

if (adapter->pmac_id) {
for (i = 0; i < (adapter->uc_macs + 1); i++)
be_cmd_pmac_del(adapter, adapter->if_handle,
adapter->pmac_id[i], 0);
adapter->uc_macs = 0;

kfree(adapter->pmac_id);
adapter->pmac_id = NULL;
}
}

static int be_clear(struct be_adapter *adapter)
{
be_cancel_worker(adapter);

if (sriov_enabled(adapter))
be_vf_clear(adapter);

/* delete the primary mac along with the uc-mac list */
for (i = 0; i < (adapter->uc_macs + 1); i++)
be_cmd_pmac_del(adapter, adapter->if_handle,
adapter->pmac_id[i], 0);
adapter->uc_macs = 0;
be_mac_clear(adapter);

be_cmd_if_destroy(adapter, adapter->if_handle, 0);

be_clear_queues(adapter);

kfree(adapter->pmac_id);
adapter->pmac_id = NULL;

be_msix_disable(adapter);
return 0;
}
Expand Down

0 comments on commit b05004a

Please sign in to comment.