Skip to content
  • Stefano Brivio's avatar
    netfilter: ipset: list:set: Decrease refcount synchronously on deletion and replace · 439cd39e
    Stefano Brivio authored
    Commit 45040978
    
     ("netfilter: ipset: Fix set:list type crash
    when flush/dump set in parallel") postponed decreasing set
    reference counters to the RCU callback.
    
    An 'ipset del' command can terminate before the RCU grace period
    is elapsed, and if sets are listed before then, the reference
    counter shown in userspace will be wrong:
    
     # ipset create h hash:ip; ipset create l list:set; ipset add l
     # ipset del l h; ipset list h
     Name: h
     Type: hash:ip
     Revision: 4
     Header: family inet hashsize 1024 maxelem 65536
     Size in memory: 88
     References: 1
     Number of entries: 0
     Members:
     # sleep 1; ipset list h
     Name: h
     Type: hash:ip
     Revision: 4
     Header: family inet hashsize 1024 maxelem 65536
     Size in memory: 88
     References: 0
     Number of entries: 0
     Members:
    
    Fix this by making the reference count update synchronous again.
    
    As a result, when sets are listed, ip_set_name_byindex() might
    now fetch a set whose reference count is already zero. Instead
    of relying on the reference count to protect against concurrent
    set renaming, grab ip_set_ref_lock as reader and copy the name,
    while holding the same lock in ip_set_rename() as writer
    instead.
    
    Reported-by: default avatarLi Shuang <shuali@redhat.com>
    Fixes: 45040978
    
     ("netfilter: ipset: Fix set:list type crash when flush/dump set in parallel")
    Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Signed-off-by: default avatarJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    439cd39e