Subject: [PATCH] xfrm: fix a possible policy leak

From: [email-masked]
Date: Fri, 8 May 2015 15:13:35 +0800

From: "Signed-off-by: Li RongQing" <[email-masked]>

policy should be put if exit xfrm_policy_bysel_ctx() due to the
failure of calling security_xfrm_policy_delete. since policy has
been hold before

Fixes: ef41aaa0b7 [IPSEC]: xfrm_policy delete security check misplaced
Signed-off-by: Li RongQing <[email-masked]>
Cc: Eric Paris <[email-masked]>
---
 net/xfrm/xfrm_policy.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 3d264e5..66450c3 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -824,6 +824,7 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u32 mark, u8 type,
 				*err = security_xfrm_policy_delete(
 								pol->security);
 				if (*err) {
+					xfrm_pol_put(pol);
 					write_unlock_bh(&net->xfrm.xfrm_policy_lock);
 					return pol;
 				}
@@ -863,6 +864,7 @@ struct xfrm_policy *xfrm_policy_byid(struct net *net, u32 mark, u8 type,
 				*err = security_xfrm_policy_delete(
 								pol->security);
 				if (*err) {
+					xfrm_pol_put(pol);
 					write_unlock_bh(&net->xfrm.xfrm_policy_lock);
 					return pol;
 				}
-- 
2.1.0