aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarissa Wall <marissaw@google.com>2018-02-08 09:56:29 -0800
committerMoyster <oysterized@gmail.com>2018-02-12 15:05:27 +0100
commit552d7d58463e24a3eb4fefce58940891416492b7 (patch)
tree8bd5a24fff5a706f4a846205d6189394d99a818f
parentba4ed7ab9c27ee458425b11891bf4d04bb446b05 (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>
-rw-r--r--drivers/block/loop.c10
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,