• Davide Caratti's avatar
    net/sched: fix idr leak on the error path of tcf_bpf_init() · bbc09e78
    Davide Caratti authored
    when the following command sequence is entered
    
     # tc action add action bpf bytecode '4,40 0 0 12,31 0 1 2048,6 0 0 262144,6 0 0 0' index 100
     RTNETLINK answers: Invalid argument
     We have an error talking to the kernel
     # tc action add action bpf bytecode '4,40 0 0 12,21 0 1 2048,6 0 0 262144,6 0 0 0' index 100
     RTNETLINK answers: No space left on device
     We have an error talking to the kernel
    
    act_bpf correctly refuses to install the first TC rule, because 31 is not
    a valid instruction. However, it refuses to install the second TC rule,
    even if the BPF code is correct. Furthermore, it's no more possible to
    install any other rule having the same value of 'index' until act_bpf
    module is unloaded/inserted again. After the idr has been reserved, call
    tcf_idr_release() instead of tcf_idr_cleanup(), to fix this issue.
    
    Fixes: 65a206c0 ("net/sched: Change act_api and act_xxx modules to use IDR")
    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>
    bbc09e78
act_bpf.c 9.7 KB