mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
net: mvpp2: fix possible memory leak
we are allocating memory using kzalloc for struct mvpp2_prs_entry, but later when we are getting error we were just returning the error value without releasing the memory. Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ec1f127602
commit
437374735c
@ -1692,6 +1692,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
|||||||
{
|
{
|
||||||
struct mvpp2_prs_entry *pe;
|
struct mvpp2_prs_entry *pe;
|
||||||
int tid_aux, tid;
|
int tid_aux, tid;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
pe = mvpp2_prs_vlan_find(priv, tpid, ai);
|
pe = mvpp2_prs_vlan_find(priv, tpid, ai);
|
||||||
|
|
||||||
@ -1723,8 +1724,10 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tid <= tid_aux)
|
if (tid <= tid_aux) {
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
memset(pe, 0 , sizeof(struct mvpp2_prs_entry));
|
memset(pe, 0 , sizeof(struct mvpp2_prs_entry));
|
||||||
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
||||||
@ -1756,9 +1759,10 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
|||||||
|
|
||||||
mvpp2_prs_hw_write(priv, pe);
|
mvpp2_prs_hw_write(priv, pe);
|
||||||
|
|
||||||
|
error:
|
||||||
kfree(pe);
|
kfree(pe);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get first free double vlan ai number */
|
/* Get first free double vlan ai number */
|
||||||
@ -1821,7 +1825,7 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
|||||||
unsigned int port_map)
|
unsigned int port_map)
|
||||||
{
|
{
|
||||||
struct mvpp2_prs_entry *pe;
|
struct mvpp2_prs_entry *pe;
|
||||||
int tid_aux, tid, ai;
|
int tid_aux, tid, ai, ret = 0;
|
||||||
|
|
||||||
pe = mvpp2_prs_double_vlan_find(priv, tpid1, tpid2);
|
pe = mvpp2_prs_double_vlan_find(priv, tpid1, tpid2);
|
||||||
|
|
||||||
@ -1838,8 +1842,10 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
|||||||
|
|
||||||
/* Set ai value for new double vlan entry */
|
/* Set ai value for new double vlan entry */
|
||||||
ai = mvpp2_prs_double_vlan_ai_free_get(priv);
|
ai = mvpp2_prs_double_vlan_ai_free_get(priv);
|
||||||
if (ai < 0)
|
if (ai < 0) {
|
||||||
return ai;
|
ret = ai;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get first single/triple vlan tid */
|
/* Get first single/triple vlan tid */
|
||||||
for (tid_aux = MVPP2_PE_FIRST_FREE_TID;
|
for (tid_aux = MVPP2_PE_FIRST_FREE_TID;
|
||||||
@ -1859,8 +1865,10 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tid >= tid_aux)
|
if (tid >= tid_aux) {
|
||||||
return -ERANGE;
|
ret = -ERANGE;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
memset(pe, 0, sizeof(struct mvpp2_prs_entry));
|
memset(pe, 0, sizeof(struct mvpp2_prs_entry));
|
||||||
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
||||||
@ -1887,8 +1895,9 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
|||||||
mvpp2_prs_tcam_port_map_set(pe, port_map);
|
mvpp2_prs_tcam_port_map_set(pe, port_map);
|
||||||
mvpp2_prs_hw_write(priv, pe);
|
mvpp2_prs_hw_write(priv, pe);
|
||||||
|
|
||||||
|
error:
|
||||||
kfree(pe);
|
kfree(pe);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IPv4 header parsing for fragmentation and L4 offset */
|
/* IPv4 header parsing for fragmentation and L4 offset */
|
||||||
|
Loading…
Reference in New Issue
Block a user