Skip to content
  • Liping Zhang's avatar
    netfilter: nf_ct_h323: do not re-activate already expired timer · 707e6835
    Liping Zhang authored
    Commit 96d1327a ("netfilter: h323: Use mod_timer instead of
    set_expect_timeout") just simplify the source codes
        if (!del_timer(&exp->timeout))
            return 0;
        add_timer(&exp->timeout);
    to mod_timer(&exp->timeout, jiffies + info->timeout * HZ);
    
    This is not correct, and introduce a race codition:
        CPU0                     CPU1
         -                     timer expire
      process_rcf              expectation_timed_out
      lock(exp_lock)              -
      find_exp                 waiting exp_lock...
      re-activate timer!!      waiting exp_lock...
      unlock(exp_lock)         lock(exp_lock)
         -                     unlink expect
         -                     free(expect)
         -                     unlock(exp_lock)
    So when the timer expires again, we will access the memory that
    was already freed.
    
    Replace mod_timer with mod_timer_pending here to fix this problem.
    
    Fixes: 96d1327a
    
     ("netfilter: h323: Use mod_timer instead of set_expect_timeout")
    Cc: Gao Feng <fgao@ikuai8.com>
    Signed-off-by: default avatarLiping Zhang <liping.zhang@spreadtrum.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    707e6835