• Martin KaFai Lau's avatar
    ipv6: Avoid creating RTF_CACHE from a rt that is not managed by fib6 tree · 0d3f6d29
    Martin KaFai Lau authored
    The original bug report:
    https://bugzilla.redhat.com/show_bug.cgi?id=1272571
    
    The setup has a IPv4 GRE tunnel running in a IPSec.  The bug
    happens when ndisc starts sending router solicitation at the gre
    interface.  The simplified oops stack is like:
    
    __lock_acquire+0x1b2/0x1c30
    lock_acquire+0xb9/0x140
    _raw_write_lock_bh+0x3f/0x50
    __ip6_ins_rt+0x2e/0x60
    ip6_ins_rt+0x49/0x50
    ~~~~~~~~
    __ip6_rt_update_pmtu.part.54+0x145/0x250
    ip6_rt_update_pmtu+0x2e/0x40
    ~~~~~~~~
    ip_tunnel_xmit+0x1f1/0xf40
    __gre_xmit+0x7a/0x90
    ipgre_xmit+0x15a/0x220
    dev_hard_start_xmit+0x2bd/0x480
    __dev_queue_xmit+0x696/0x730
    dev_queue_xmit+0x10/0x20
    neigh_direct_output+0x11/0x20
    ip6_finish_output2+0x21f/0x770
    ip6_finish_output+0xa7/0x1d0
    ip6_output+0x56/0x190
    ~~~~~~~~
    ndisc_send_skb+0x1d9/0x400
    ndisc_send_rs+0x88/0xc0
    ~~~~~~~~
    
    The rt passed to ip6_rt_update_pmtu() is created by
    icmp6_dst_alloc() and it is not managed by the fib6 tree,
    so its rt6i_table == NULL.  When __ip6_rt_update_pmtu() creates
    a RTF_CACHE clone, the newly created clone also has rt6i_table == NULL
    and it causes the ip6_ins_rt() oops.
    
    During pmtu update, we only want to create a RTF_CACHE clone
    from a rt which is currently managed (or owned) by the
    fib6 tree.  It means either rt->rt6i_node != NULL or
    rt is a RTF_PCPU clone.
    
    It is worth to note that rt6i_table may not be NULL even it is
    not (yet) managed by the fib6 tree (e.g. addrconf_dst_alloc()).
    Hence, rt6i_node is a better check instead of rt6i_table.
    
    Fixes: 45e4fd26 ("ipv6: Only create RTF_CACHE routes after encountering pmtu")
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Reported-by: default avatarChris Siebenmann <cks-rhbugzilla@cs.toronto.edu>
    Cc: Chris Siebenmann <cks-rhbugzilla@cs.toronto.edu>
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0d3f6d29
route.c 90.1 KB