diff options
| author | Somnath Kotur <somnath.kotur@emulex.com> | 2013-12-05 12:08:16 +0530 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-12-06 15:03:40 -0500 | 
| commit | b05004adf9d34e7fb8e96fe6a7cdeb0843f5ab35 (patch) | |
| tree | 95a9a5f6e67ae6361f16f88297348c9874578231 /drivers/net/ethernet/emulex | |
| parent | 4bebb56a6d50ca50a34048194877dca34f572f8f (diff) | |
| download | linux-b05004adf9d34e7fb8e96fe6a7cdeb0843f5ab35.tar.bz2 | |
be2net: Free/delete pmacs (in be_clear()) only if they exist
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>
Diffstat (limited to 'drivers/net/ethernet/emulex')
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 23 | 
1 files changed, 15 insertions, 8 deletions
| diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index a2302dc061f3..0fde69d5cb6a 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -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;  } |