diff options
author | Konstantin Khlebnikov <khlebnikov@yandex-team.ru> | 2017-08-15 15:35:21 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-08-16 02:16:39 +0200 |
commit | 898904226b5a6dee657f23cf51e385f50da22596 (patch) | |
tree | 1d05b77926120b605ee6ef71f3abe270a49c66e6 /net/sched/sch_atm.c | |
parent | ipv4: fix NULL dereference in free_fib_info_rcu() (diff) | |
download | linux-898904226b5a6dee657f23cf51e385f50da22596.tar.xz linux-898904226b5a6dee657f23cf51e385f50da22596.zip |
net_sched: reset pointers to tcf blocks in classful qdiscs' destructors
Traffic filters could keep direct pointers to classes in classful qdisc,
thus qdisc destruction first removes all filters before freeing classes.
Class destruction methods also tries to free attached filters but now
this isn't safe because tcf_block_put() unlike to tcf_destroy_chain()
cannot be called second time.
This patch set class->block to NULL after first tcf_block_put() and
turn second call into no-op.
Fixes: 6529eaba33f0 ("net: sched: introduce tcf block infractructure")
Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_atm.c')
-rw-r--r-- | net/sched/sch_atm.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 572fe2584e48..c403c87aff7a 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -572,8 +572,10 @@ static void atm_tc_destroy(struct Qdisc *sch) struct atm_flow_data *flow, *tmp; pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); - list_for_each_entry(flow, &p->flows, list) + list_for_each_entry(flow, &p->flows, list) { tcf_block_put(flow->block); + flow->block = NULL; + } list_for_each_entry_safe(flow, tmp, &p->flows, list) { if (flow->ref > 1) |