]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv6: xfrm6: release dst on error in xfrm6_rcv_encap()
authorYilin Zhu <zylzyl2333@gmail.com>
Sun, 12 Apr 2026 05:07:54 +0000 (13:07 +0800)
committerSteffen Klassert <steffen.klassert@secunet.com>
Fri, 17 Apr 2026 08:40:29 +0000 (10:40 +0200)
xfrm6_rcv_encap() performs an IPv6 route lookup when the skb does not
already have a dst attached. ip6_route_input_lookup() returns a
referenced dst entry even when the lookup resolves to an error route.

If dst->error is set, xfrm6_rcv_encap() drops the skb without attaching
the dst to the skb and without releasing the reference returned by the
lookup. Repeated packets hitting this path therefore leak dst entries.

Release the dst before jumping to the drop path.

Fixes: 0146dca70b87 ("xfrm: add support for UDPv6 encapsulation of ESP")
Cc: stable@kernel.org
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Co-developed-by: Yuan Tan <yuantan098@gmail.com>
Signed-off-by: Yuan Tan <yuantan098@gmail.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Tested-by: Ruide Cao <caoruide123@gmail.com>
Signed-off-by: Yilin Zhu <zylzyl2333@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/ipv6/xfrm6_protocol.c

index ea2f805d3b014c927a3d339375e78a6423556836..9b586fcec4850b8f492039db0bf861e0fda7d28a 100644 (file)
@@ -88,8 +88,10 @@ int xfrm6_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
 
                dst = ip6_route_input_lookup(dev_net(skb->dev), skb->dev, &fl6,
                                             skb, flags);
-               if (dst->error)
+               if (dst->error) {
+                       dst_release(dst);
                        goto drop;
+               }
                skb_dst_set(skb, dst);
        }