• Wei Wang's avatar
    ipv6: add key length check into rt6_select() · 17ecf590
    Wei Wang authored
    After rwlock is replaced with rcu and spinlock, fib6_lookup() could
    potentially return an intermediate node if other thread is doing
    fib6_del() on a route which is the only route on the node so that
    fib6_repair_tree() will be called on this node and potentially assigns
    fn->leaf to the its child's fn->leaf.
    
    In order to detect this situation in rt6_select(), we have to check if
    fn->fn_bit is consistent with the key length stored in the route. And
    depending on if the fn is in the subtree or not, the key is either
    rt->rt6i_dst or rt->rt6i_src.
    If any inconsistency is found, that means the node no longer holds valid
    routes in it. So net->ipv6.ip6_null_entry is returned.
    Signed-off-by: default avatarWei Wang <weiwan@google.com>
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    17ecf590
route.c 118 KB