Skip to content
  • Florian Westphal's avatar
    netfilter: nf_tables: don't skip inactive chains during update · 0fb39bbe
    Florian Westphal authored
    There is no synchronization between packet path and the configuration plane.
    
    The packet path uses two arrays with rules, one contains the current (active)
    generation.  The other either contains the last (obsolete) generation or
    the future one.
    
    Consider:
    cpu1               cpu2
                       nft_do_chain(c);
    delete c
    net->gen++;
                       genbit = !!net->gen;
                       rules = c->rg[genbit];
    
    cpu1 ignores c when updating if c is not active anymore in the new
    generation.
    
    On cpu2, we now use rules from wrong generation, as c->rg[old]
    contains the rules matching 'c' whereas c->rg[new] was not updated and
    can even point to rules that have been free'd already, causing a crash.
    
    To fix this, make sure that 'current' to the 'next' generation are
    identical for chains that are going away so that c->rg[new] will just
    use the matching rules even if genbit was incremented already.
    
    Fixes: 0cbc06b3
    
     ("netfilter: nf_tables: remove synchronize_rcu in commit phase")
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    0fb39bbe