Message ID | 20220724095557.4350-1-xiongx18@fudan.edu.cn (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | xfrm: fix refcount leak in __xfrm_policy_check() | expand |
On Sun, Jul 24, 2022 at 05:55:58PM +0800, Xin Xiong wrote: > The issue happens on an error path in __xfrm_policy_check(). When the > fetching process of the object `pols[1]` fails, the function simply > returns 0, forgetting to decrement the reference count of `pols[0]`, > which is incremented earlier by either xfrm_sk_policy_lookup() or > xfrm_policy_lookup(). This may result in memory leaks. > > Fix it by decreasing the reference count of `pols[0]` in that path. > > Fixes: 134b0fc544ba ("IPsec: propagate security module errors up from flow_cache_lookup") > Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn> > Signed-off-by: Xin Tan <tanxin.ctf@gmail.com> Applied, thanks a lot Xin!
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index f1a0bab920a5..4f8bbb825abc 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -3599,6 +3599,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, if (pols[1]) { if (IS_ERR(pols[1])) { XFRM_INC_STATS(net, LINUX_MIB_XFRMINPOLERROR); + xfrm_pol_put(pols[0]); return 0; } pols[1]->curlft.use_time = ktime_get_real_seconds();