]> git.baikalelectronics.ru Git - kernel.git/commit
io_uring: cleanup fixed file data table references
authorJens Axboe <axboe@kernel.dk>
Wed, 5 Feb 2020 02:54:55 +0000 (19:54 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 5 Feb 2020 03:04:18 +0000 (20:04 -0700)
commit7d2e147fbfd33ec869757d586dc4d1a0d97b1114
treeebbae989219154e27a95c4558f201202a5fe0681
parenta5803e8f947afff78bafbd06df00272bb9da9b1f
io_uring: cleanup fixed file data table references

syzbot reports a use-after-free in io_ring_file_ref_switch() when it
tries to switch back to percpu mode. When we put the final reference to
the table by calling percpu_ref_kill_and_confirm(), we don't want the
zero reference to queue async work for flushing the potentially queued
up items. We currently do a few flush_work(), but they merely paper
around the issue, since the work item may not have been queued yet
depending on the when the percpu-ref callback gets run.

Coming into the file unregister, we know we have the ring quiesced.
io_ring_file_ref_switch() can check for whether or not the ref is dying
or not, and not queue anything async at that point. Once the ref has
been confirmed killed, flush any potential items manually.

Reported-by: syzbot+7caeaea49c2c8a591e3d@syzkaller.appspotmail.com
Fixes: 320ac128219a ("io_uring: avoid ring quiesce for fixed file set unregister and update")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c