mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
ipsec: Fix dst leak in xfrm_bundle_create().
If we cannot find a suitable inner_mode value, we will leak the currently allocated 'xdst'. The fix is to make sure it is linked into the chain before erroring out. Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
c0576e3975
commit
10a7ef3367
@ -1573,6 +1573,14 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
||||
goto put_states;
|
||||
}
|
||||
|
||||
if (!dst_prev)
|
||||
dst0 = dst1;
|
||||
else
|
||||
/* Ref count is taken during xfrm_alloc_dst()
|
||||
* No need to do dst_clone() on dst1
|
||||
*/
|
||||
dst_prev->child = dst1;
|
||||
|
||||
if (xfrm[i]->sel.family == AF_UNSPEC) {
|
||||
inner_mode = xfrm_ip2inner_mode(xfrm[i],
|
||||
xfrm_af2proto(family));
|
||||
@ -1584,14 +1592,6 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
||||
} else
|
||||
inner_mode = xfrm[i]->inner_mode;
|
||||
|
||||
if (!dst_prev)
|
||||
dst0 = dst1;
|
||||
else
|
||||
/* Ref count is taken during xfrm_alloc_dst()
|
||||
* No need to do dst_clone() on dst1
|
||||
*/
|
||||
dst_prev->child = dst1;
|
||||
|
||||
xdst->route = dst;
|
||||
dst_copy_metrics(dst1, dst);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user