diff options
| author | Marissa Wall <marissaw@google.com> | 2018-02-08 09:56:29 -0800 |
|---|---|---|
| committer | Moyster <oysterized@gmail.com> | 2018-02-12 15:05:27 +0100 |
| commit | 552d7d58463e24a3eb4fefce58940891416492b7 (patch) | |
| tree | 8bd5a24fff5a706f4a846205d6189394d99a818f /drivers | |
| parent | ba4ed7ab9c27ee458425b11891bf4d04bb446b05 (diff) | |
UPSTREAM: loop: fix concurrent lo_open/lo_release
范龙飞 reports that KASAN can report a use-after-free in __lock_acquire.
The reason is due to insufficient serialization in lo_release(), which
will continue to use the loop device even after it has decremented the
lo_refcnt to zero.
In the meantime, another process can come in, open the loop device
again as it is being shut down. Confusion ensues.
(cherry-picked from ae6650163c66a7eff1acd6eb8b0f752dcfa8eba5)
Change-Id: Iada5ceba515f0137db8c95d0746e8ffc753037f3
Reported-by: 范龙飞 <long7573@126.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Marissa Wall <marissaw@google.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/block/loop.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 4a8116547..333458ca1 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1511,9 +1511,8 @@ out: return err; } -static void lo_release(struct gendisk *disk, fmode_t mode) +static void __lo_release(struct loop_device *lo) { - struct loop_device *lo = disk->private_data; int err; mutex_lock(&lo->lo_ctl_mutex); @@ -1541,6 +1540,13 @@ out: mutex_unlock(&lo->lo_ctl_mutex); } +static void lo_release(struct gendisk *disk, fmode_t mode) +{ + mutex_lock(&loop_index_mutex); + __lo_release(disk->private_data); + mutex_unlock(&loop_index_mutex); +} + static const struct block_device_operations lo_fops = { .owner = THIS_MODULE, .open = lo_open, |
