Skip to content

Commit 553f911

Browse files
herbertxdavem330
authored andcommitted
xfrm: Fix xfrm_state_clone leak
xfrm_state_clone calls kfree instead of xfrm_state_put to free a failed state. Depending on the state of the failed state, it can cause leaks to things like module references. All states should be freed by xfrm_state_put past the point of xfrm_init_state. Signed-off-by: Herbert Xu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 10e7454 commit 553f911

File tree

1 file changed

+3
-9
lines changed

1 file changed

+3
-9
lines changed

net/xfrm/xfrm_state.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
11021102
int err = -ENOMEM;
11031103
struct xfrm_state *x = xfrm_state_alloc(net);
11041104
if (!x)
1105-
goto error;
1105+
goto out;
11061106

11071107
memcpy(&x->id, &orig->id, sizeof(x->id));
11081108
memcpy(&x->sel, &orig->sel, sizeof(x->sel));
@@ -1160,16 +1160,10 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
11601160
return x;
11611161

11621162
error:
1163+
xfrm_state_put(x);
1164+
out:
11631165
if (errp)
11641166
*errp = err;
1165-
if (x) {
1166-
kfree(x->aalg);
1167-
kfree(x->ealg);
1168-
kfree(x->calg);
1169-
kfree(x->encap);
1170-
kfree(x->coaddr);
1171-
}
1172-
kfree(x);
11731167
return NULL;
11741168
}
11751169

0 commit comments

Comments
 (0)