• Christoph Paasch's avatar
    tcp: metrics: Fix rcu-race when deleting multiple entries · 00ca9c5b
    Christoph Paasch authored
    In bbf852b9 I introduced the tmlist, which allows to delete
    multiple entries from the cache that match a specified destination if no
    source-IP is specified.
    
    However, as the cache is an RCU-list, we should not create this tmlist, as
    it will change the tcpm_next pointer of the element that will be deleted
    and so a thread iterating over the cache's entries while holding the
    RCU-lock might get "redirected" to this tmlist.
    
    This patch fixes this, by reverting back to the old behavior prior to
    bbf852b9, which means that we simply change the tcpm_next
    pointer of the previous element (pp) to jump over the one we are
    deleting.
    The difference is that we call kfree_rcu() directly on the cache entry,
    which allows us to delete multiple entries from the list.
    
    Fixes: bbf852b9 (tcp: metrics: Delete all entries matching a certain destination)
    Signed-off-by: default avatarChristoph Paasch <christoph.paasch@uclouvain.be>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    00ca9c5b
tcp_metrics.c 29.6 KB