Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fd91fb3 authored by Li RongQing's avatar Li RongQing Committed by David S. Miller
Browse files

ipv6: recursive check rt->dst.from when call rt6_check_expired



If dst cache dst_a copies from dst_b, and dst_b copies from dst_c, check
if dst_a is expired or not, we should not end with dst_a->dst.from, dst_b,
we should check dst_c.

CC: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: default avatarLi RongQing <roy.qing.li@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b40863c6
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -369,15 +369,11 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,

static bool rt6_check_expired(const struct rt6_info *rt)
{
	struct rt6_info *ort = NULL;

	if (rt->rt6i_flags & RTF_EXPIRES) {
		if (time_after(jiffies, rt->dst.expires))
			return true;
	} else if (rt->dst.from) {
		ort = (struct rt6_info *) rt->dst.from;
		return (ort->rt6i_flags & RTF_EXPIRES) &&
			time_after(jiffies, ort->dst.expires);
		return rt6_check_expired((struct rt6_info *) rt->dst.from);
	}
	return false;
}