kernel_optimize_test/net/sched
Davide Caratti f29cdfbe33 net/sched: fix idr leak in the error path of tcf_skbmod_init()
tcf_skbmod_init() can fail after the idr has been successfully reserved.
When this happens, every subsequent attempt to configure skbmod rules
using the same idr value will systematically fail with -ENOSPC, unless
the first attempt was done using the 'replace' keyword:

 # tc action add action skbmod swap mac index 100
 RTNETLINK answers: Cannot allocate memory
 We have an error talking to the kernel
 # tc action add action skbmod swap mac index 100
 RTNETLINK answers: No space left on device
 We have an error talking to the kernel
 # tc action add action skbmod swap mac index 100
 RTNETLINK answers: No space left on device
 We have an error talking to the kernel
 ...

Fix this in tcf_skbmod_init(), ensuring that tcf_idr_release() is called
on the error path when the idr has been reserved, but not yet inserted.
Also, don't test 'ovr' in the error path, to avoid a 'replace' failure
implicitly become a 'delete' that leaks refcount in act_skbmod module:

 # rmmod act_skbmod; modprobe act_skbmod
 # tc action add action skbmod swap mac index 100
 # tc action add action skbmod swap mac continue index 100
 RTNETLINK answers: File exists
 We have an error talking to the kernel
 # tc action replace action skbmod swap mac continue index 100
 RTNETLINK answers: Cannot allocate memory
 We have an error talking to the kernel
 # tc action list action skbmod
 #
 # rmmod  act_skbmod
 rmmod: ERROR: Module act_skbmod is in use

Fixes: 65a206c01e ("net/sched: Change act_api and act_xxx modules to use IDR")
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2018-03-21 18:12:37 -04:00
..
act_api.c
act_bpf.c net/sched: fix idr leak on the error path of tcf_bpf_init() 2018-03-21 18:11:46 -04:00
act_connmark.c
act_csum.c net/sched: fix NULL dereference in the error path of tcf_csum_init() 2018-03-17 19:53:28 -04:00
act_gact.c
act_ife.c
act_ipt.c net/sched: fix idr leak in the error path of __tcf_ipt_init() 2018-03-21 18:12:16 -04:00
act_meta_mark.c
act_meta_skbprio.c
act_meta_skbtcindex.c
act_mirred.c
act_nat.c
act_pedit.c net/sched: fix idr leak in the error path of tcp_pedit_init() 2018-03-21 18:12:08 -04:00
act_police.c net/sched: fix idr leak in the error path of tcf_act_police_init() 2018-03-21 18:12:00 -04:00
act_sample.c net/sched: fix NULL dereference in the error path of tcf_sample_init() 2018-03-17 19:53:28 -04:00
act_simple.c net/sched: fix idr leak in the error path of tcf_simp_init() 2018-03-21 18:11:53 -04:00
act_skbedit.c
act_skbmod.c net/sched: fix idr leak in the error path of tcf_skbmod_init() 2018-03-21 18:12:37 -04:00
act_tunnel_key.c net/sched: fix NULL dereference in the error path of tunnel_key_init() 2018-03-17 19:53:28 -04:00
act_vlan.c net/sched: fix idr leak in the error path of tcf_vlan_init() 2018-03-21 18:12:27 -04:00
cls_api.c
cls_basic.c
cls_bpf.c
cls_cgroup.c
cls_flow.c
cls_flower.c
cls_fw.c
cls_matchall.c
cls_route.c
cls_rsvp6.c
cls_rsvp.c
cls_rsvp.h
cls_tcindex.c
cls_u32.c
em_canid.c
em_cmp.c
em_ipset.c
em_meta.c
em_nbyte.c
em_text.c
em_u32.c
ematch.c
Kconfig
Makefile
sch_api.c
sch_atm.c
sch_blackhole.c
sch_cbq.c
sch_cbs.c
sch_choke.c
sch_codel.c
sch_drr.c
sch_dsmark.c
sch_fifo.c
sch_fq_codel.c
sch_fq.c
sch_generic.c
sch_gred.c
sch_hfsc.c
sch_hhf.c
sch_htb.c
sch_ingress.c
sch_mq.c
sch_mqprio.c
sch_multiq.c
sch_netem.c
sch_pie.c
sch_plug.c
sch_prio.c
sch_qfq.c
sch_red.c
sch_sfb.c
sch_sfq.c
sch_tbf.c
sch_teql.c