• Davide Caratti's avatar
    net/sched: fix idr leak in the error path of tcf_simp_init() · 60e10b3a
    Davide Caratti authored
    if the kernel fails to duplicate 'sdata', creation of a new action fails
    with -ENOMEM. However, subsequent attempts to install the same action
    using the same value of 'index' systematically fail with -ENOSPC, and
    that value of 'index' will no more be usable by act_simple, until rmmod /
    insmod of act_simple.ko is done:
    
     # tc actions add action simple sdata hello index 100
     # tc actions list action simple
    
            action order 0: Simple <hello>
             index 100 ref 1 bind 0
     # tc actions flush action simple
     # tc actions add action simple sdata hello index 100
     RTNETLINK answers: Cannot allocate memory
     We have an error talking to the kernel
     # tc actions flush action simple
     # tc actions add action simple sdata hello index 100
     RTNETLINK answers: No space left on device
     We have an error talking to the kernel
     # tc actions add action simple sdata hello index 100
     RTNETLINK answers: No space left on device
     We have an error talking to the kernel
     ...
    
    Fix this in the error path of tcf_simp_init(), calling tcf_idr_release()
    in place of tcf_idr_cleanup().
    
    Fixes: 65a206c0 ("net/sched: Change act_api and act_xxx modules to use IDR")
    Suggested-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
    Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
    Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    60e10b3a
act_simple.c 5.63 KB