• Sean Tranchetti's avatar
    net: ipv6: fib: flush exceptions when purging route · d8f5c296
    Sean Tranchetti authored
    Route removal is handled by two code paths. The main removal path is via
    fib6_del_route() which will handle purging any PMTU exceptions from the
    cache, removing all per-cpu copies of the DST entry used by the route, and
    releasing the fib6_info struct.
    
    The second removal location is during fib6_add_rt2node() during a route
    replacement operation. This path also calls fib6_purge_rt() to handle
    cleaning up the per-cpu copies of the DST entries and releasing the
    fib6_info associated with the older route, but it does not flush any PMTU
    exceptions that the older route had. Since the older route is removed from
    the tree during the replacement, we lose any way of accessing it again.
    
    As these lingering DSTs and the fib6_info struct are holding references to
    the underlying netdevice struct as well, unregistering that device from the
    kernel can never complete.
    
    Fixes: 2b760fcf ("ipv6: hook up exception table to store dst cache")
    Signed-off-by: default avatarSean Tranchetti <stranche@codeaurora.org>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Link: https://lore.kernel.org/r/1609892546-11389-1-git-send-email-stranche@quicinc.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d8f5c296
ip6_fib.c 62.4 KB