mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-21 23:29:26 -05:00
idpf: fix potential memory leak on kcalloc() failure
In case of failing on rss_data->rss_key allocation the function is
freeing vport without freeing earlier allocated q_vector_idxs. Fix it.
Move from freeing in error branch to goto scheme.
Fixes: d4d5587182 ("idpf: initialize interrupts and enable vport")
Reviewed-by: Pavan Kumar Linga <pavan.kumar.linga@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Suggested-by: Pavan Kumar Linga <pavan.kumar.linga@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Samuel Salin <Samuel.salin@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
d4cb1ecc22
commit
8a558cbda5
@@ -1113,11 +1113,9 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,
|
||||
|
||||
num_max_q = max(max_q->max_txq, max_q->max_rxq);
|
||||
vport->q_vector_idxs = kcalloc(num_max_q, sizeof(u16), GFP_KERNEL);
|
||||
if (!vport->q_vector_idxs) {
|
||||
kfree(vport);
|
||||
if (!vport->q_vector_idxs)
|
||||
goto free_vport;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
idpf_vport_init(vport, max_q);
|
||||
|
||||
/* This alloc is done separate from the LUT because it's not strictly
|
||||
@@ -1127,11 +1125,9 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,
|
||||
*/
|
||||
rss_data = &adapter->vport_config[idx]->user_config.rss_data;
|
||||
rss_data->rss_key = kzalloc(rss_data->rss_key_size, GFP_KERNEL);
|
||||
if (!rss_data->rss_key) {
|
||||
kfree(vport);
|
||||
if (!rss_data->rss_key)
|
||||
goto free_vector_idxs;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
/* Initialize default rss key */
|
||||
netdev_rss_key_fill((void *)rss_data->rss_key, rss_data->rss_key_size);
|
||||
|
||||
@@ -1144,6 +1140,13 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,
|
||||
adapter->next_vport = idpf_get_free_slot(adapter);
|
||||
|
||||
return vport;
|
||||
|
||||
free_vector_idxs:
|
||||
kfree(vport->q_vector_idxs);
|
||||
free_vport:
|
||||
kfree(vport);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user