Commit bc0fcb98 authored by Yilin Zhu's avatar Yilin Zhu Committed by Steffen Klassert
Browse files

ipv6: xfrm6: release dst on error in xfrm6_rcv_encap()



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: 0146dca7 ("xfrm: add support for UDPv6 encapsulation of ESP")
Cc: stable@kernel.org
Reported-by: default avatarYifan Wu <yifanwucs@gmail.com>
Reported-by: default avatarJuefei Pu <tomapufckgml@gmail.com>
Co-developed-by: default avatarYuan Tan <yuantan098@gmail.com>
Signed-off-by: default avatarYuan Tan <yuantan098@gmail.com>
Suggested-by: default avatarXin Liu <bird@lzu.edu.cn>
Tested-by: default avatarRuide Cao <caoruide123@gmail.com>
Signed-off-by: default avatarYilin Zhu <zylzyl2333@gmail.com>
Signed-off-by: default avatarRen Wei <n05ec@lzu.edu.cn>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 1f5ffc67
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);
	}