diff options
author | Cong Wang <xiyou.wangcong@gmail.com> | 2020-03-11 22:42:27 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-03-14 20:41:17 -0700 |
commit | b1be2e8cd290f620777bfdb8aa00890cd2fa02b5 (patch) | |
tree | 354a128e161f6afef1855d37fb332f6db2381020 /net/sched/cls_tcindex.c | |
parent | 94b18a87efdd1626a1e6aef87271af4a7c616d36 (diff) | |
download | linux-stable-b1be2e8cd290f620777bfdb8aa00890cd2fa02b5.tar.gz linux-stable-b1be2e8cd290f620777bfdb8aa00890cd2fa02b5.tar.bz2 linux-stable-b1be2e8cd290f620777bfdb8aa00890cd2fa02b5.zip |
net_sched: hold rtnl lock in tcindex_partial_destroy_work()
syzbot reported a use-after-free in tcindex_dump(). This is due to
the lack of RTNL in the deferred rcu work. We queue this work with
RTNL in tcindex_change(), later, tcindex_dump() is called:
fh = tp->ops->get(tp, t->tcm_handle);
...
err = tp->ops->change(..., &fh, ...);
tfilter_notify(..., fh, ...);
but there is nothing to serialize the pending
tcindex_partial_destroy_work() with tcindex_dump().
Fix this by simply holding RTNL in tcindex_partial_destroy_work(),
so that it won't be called until RTNL is released after
tc_new_tfilter() is completed.
Reported-and-tested-by: syzbot+653090db2562495901dc@syzkaller.appspotmail.com
Fixes: 3d210534cc93 ("net_sched: fix a race condition in tcindex_destroy()")
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/cls_tcindex.c')
-rw-r--r-- | net/sched/cls_tcindex.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c index 09b7dc5fe7e0..f2cb24b6f0cf 100644 --- a/net/sched/cls_tcindex.c +++ b/net/sched/cls_tcindex.c @@ -261,8 +261,10 @@ static void tcindex_partial_destroy_work(struct work_struct *work) struct tcindex_data, rwork); + rtnl_lock(); kfree(p->perfect); kfree(p); + rtnl_unlock(); } static void tcindex_free_perfect_hash(struct tcindex_data *cp) |