]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfrm: fix refcount leak in __xfrm_policy_check()
authorXin Xiong <xiongx18@fudan.edu.cn>
Sun, 24 Jul 2022 09:55:58 +0000 (17:55 +0800)
committerSteffen Klassert <steffen.klassert@secunet.com>
Tue, 26 Jul 2022 21:08:24 +0000 (23:08 +0200)
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>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_policy.c

index f1a0bab920a5580a507932974a86f96c08113759..4f8bbb825abcb42279630a299a0739918278fdd3 100644 (file)
@@ -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();