• Liping Zhang's avatar
    netfilter: nfnetlink_acct: fix race between nfacct del and xt_nfacct destroy · 12be15dd
    Liping Zhang authored
    Suppose that we input the following commands at first:
      # nfacct add test
      # iptables -A INPUT -m nfacct --nfacct-name test
    
    And now "test" acct's refcnt is 2, but later when we try to delete the
    "test" nfacct and the related iptables rule at the same time, race maybe
    happen:
          CPU0                                    CPU1
      nfnl_acct_try_del                      nfnl_acct_put
      atomic_dec_and_test //ref=1,testfail          -
           -                                 atomic_dec_and_test //ref=0,testok
           -                                 kfree_rcu
      atomic_inc //ref=1                            -
    
    So after the rcu grace period, nf_acct will be freed but it is still linked
    in the nfnl_acct_list, and we can access it later, then oops will happen.
    
    Convert atomic_dec_and_test and atomic_inc combinaiton to one atomic
    operation atomic_cmpxchg here to fix this problem.
    Signed-off-by: default avatarLiping Zhang <liping.zhang@spreadtrum.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    12be15dd
nfnetlink_acct.c 12.9 KB