mirror of https://github.com/torvalds/linux.git
zloop: fix KASAN use-after-free of tag set
When a zoned loop device, or zloop device, is removed, KASAN enabled
kernel reports "BUG KASAN use-after-free" in blk_mq_free_tag_set(). The
BUG happens because zloop_ctl_remove() calls put_disk(), which invokes
zloop_free_disk(). The zloop_free_disk() frees the memory allocated for
the zlo pointer. However, after the memory is freed, zloop_ctl_remove()
calls blk_mq_free_tag_set(&zlo->tag_set), which accesses the freed zlo.
Hence the KASAN use-after-free.
zloop_ctl_remove()
put_disk(zlo->disk)
put_device()
kobject_put()
...
zloop_free_disk()
kvfree(zlo)
blk_mq_free_tag_set(&zlo->tag_set)
To avoid the BUG, move the call to blk_mq_free_tag_set(&zlo->tag_set)
from zloop_ctl_remove() into zloop_free_disk(). This ensures that
the tag_set is freed before the call to kvfree(zlo).
Fixes: eb0570c7df ("block: new zoned loop block device driver")
CC: stable@vger.kernel.org
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250731110745.165751-1-shinichiro.kawasaki@wdc.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e2ba58ccc9
commit
765761851d
|
|
@ -700,6 +700,8 @@ static void zloop_free_disk(struct gendisk *disk)
|
|||
struct zloop_device *zlo = disk->private_data;
|
||||
unsigned int i;
|
||||
|
||||
blk_mq_free_tag_set(&zlo->tag_set);
|
||||
|
||||
for (i = 0; i < zlo->nr_zones; i++) {
|
||||
struct zloop_zone *zone = &zlo->zones[i];
|
||||
|
||||
|
|
@ -1080,7 +1082,6 @@ static int zloop_ctl_remove(struct zloop_options *opts)
|
|||
|
||||
del_gendisk(zlo->disk);
|
||||
put_disk(zlo->disk);
|
||||
blk_mq_free_tag_set(&zlo->tag_set);
|
||||
|
||||
pr_info("Removed device %d\n", opts->id);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue