Commit 43737473 authored by Sudip Mukherjee's avatar Sudip Mukherjee Committed by David S. Miller

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: default avatarSudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ec1f1276
...@@ -1692,6 +1692,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment