Skip to content

Commit 7657618

Browse files
kawasakiaxboe
authored andcommitted
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: eb0570c ("block: new zoned loop block device driver") CC: [email protected] Signed-off-by: Shin'ichiro Kawasaki <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent e2ba58c commit 7657618

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

drivers/block/zloop.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,8 @@ static void zloop_free_disk(struct gendisk *disk)
700700
struct zloop_device *zlo = disk->private_data;
701701
unsigned int i;
702702

703+
blk_mq_free_tag_set(&zlo->tag_set);
704+
703705
for (i = 0; i < zlo->nr_zones; i++) {
704706
struct zloop_zone *zone = &zlo->zones[i];
705707

@@ -1080,7 +1082,6 @@ static int zloop_ctl_remove(struct zloop_options *opts)
10801082

10811083
del_gendisk(zlo->disk);
10821084
put_disk(zlo->disk);
1083-
blk_mq_free_tag_set(&zlo->tag_set);
10841085

10851086
pr_info("Removed device %d\n", opts->id);
10861087

0 commit comments

Comments
 (0)