Re: net/ipv6: GPF in rt6_device_match

From: David Ahern
Date: Wed May 03 2017 - 14:22:51 EST


On 5/3/17 11:02 AM, Cong Wang wrote:
> A quick glance shows we need to simply check local->rt6i_idev
> since we do the same check for sprt right above.

As I recall, rt6i_idev is set for all routes except null_entry and it is
not set on null_entry only because of initialization order.

>
> diff --git a/net/ipv6/route.c b/net/ipv6/route.c
> index a1bf426..61ec3c8 100644
> --- a/net/ipv6/route.c
> +++ b/net/ipv6/route.c
> @@ -511,7 +511,7 @@ static inline struct rt6_info
> *rt6_device_match(struct net *net,
> sprt->rt6i_idev->dev->ifindex != oif) {
> if (flags & RT6_LOOKUP_F_IFACE)
> continue;
> - if (local &&
> + if (local && local->rt6i_idev &&
>
> local->rt6i_idev->dev->ifindex == oif)
> continue;
> }
>

Or don't consider null_entry at all:


@@ -515,7 +528,8 @@ static inline struct rt6_info
*rt6_device_match(struct net *net,

local->rt6i_idev->dev->ifindex == oif)
continue;
}
- local = sprt;
+ if (sprt != net->ipv6.ip6_null_entry)
+ local = sprt;
}