block: avoid use-after-free on throttle data
authorMing Lei <ming.lei@redhat.com>
Fri, 18 Mar 2022 13:01:42 +0000 (21:01 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 18 Mar 2022 15:57:56 +0000 (09:57 -0600)
commitee37eddbfa9e0401f13a01691cf4bbbacd2d16c9
tree8419fbd2e8d0b4206a577da2c46465318a37b13a
parent572299f03afd676dd4e20669cdaf5ed0fe1379d4
block: avoid use-after-free on throttle data

In throtl_pending_timer_fn(), request queue is retrieved from throttle
data. And tg's pending timer is deleted synchronously when releasing the
associated blkg, at that time, throttle data may have been freed since
commit 1059699f87eb ("block: move blkcg initialization/destroy into disk
allocation/release handler") moves freeing q->td to disk_release() from
blk_release_queue(). So use-after-free on q->td in throtl_pending_timer_fn
can be triggered.

Fixes the issue by:

- do nothing in case that disk is released, when there isn't any bio to
  dispatch

- retrieve request queue from blkg instead of throttle data for
non top-level pending timer.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20220318130144.1066064-2-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-throttle.c