• Liping Zhang's avatar
    netfilter: nfnl_cthelper: fix a race when walk the nf_ct_helper_hash table · 83d90219
    Liping Zhang authored
    The nf_ct_helper_hash table is protected by nf_ct_helper_mutex, while
    nfct_helper operation is protected by nfnl_lock(NFNL_SUBSYS_CTHELPER).
    So it's possible that one CPU is walking the nf_ct_helper_hash for
    cthelper add/get/del, another cpu is doing nf_conntrack_helpers_unregister
    at the same time. This is dangrous, and may cause use after free error.
    
    Note, delete operation will flush all cthelpers added via nfnetlink, so
    using rcu to do protect is not easy.
    
    Now introduce a dummy list to record all the cthelpers added via
    nfnetlink, then we can walk the dummy list instead of walking the
    nf_ct_helper_hash. Also, keep nfnl_cthelper_dump_table unchanged, it
    may be invoked without nfnl_lock(NFNL_SUBSYS_CTHELPER) held.
    Signed-off-by: default avatarLiping Zhang <zlpnobody@gmail.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    83d90219
nfnetlink_cthelper.c 18.6 KB