Skip to content

Commit 06cc978

Browse files
Tetsuo Handaaxboe
authored andcommitted
block: genhd: fix double kfree() in __alloc_disk_node()
syzbot is reporting use-after-free read at bdev_free_inode() [1], for kfree() from __alloc_disk_node() is called before bdev_free_inode() (which is called after RCU grace period) reads bdev->bd_disk and calls kfree(bdev->bd_disk). Fix use-after-free read followed by double kfree() problem by making sure that bdev->bd_disk is NULL when calling iput(). Link: https://syzkaller.appspot.com/bug?extid=8281086e8a6fbfbd952a [1] Reported-by: syzbot <[email protected]> Signed-off-by: Tetsuo Handa <[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 41e76c6 commit 06cc978

File tree

2 files changed

+2
-1
lines changed

2 files changed

+2
-1
lines changed

block/bdev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,14 +490,14 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
490490
bdev = I_BDEV(inode);
491491
mutex_init(&bdev->bd_fsfreeze_mutex);
492492
spin_lock_init(&bdev->bd_size_lock);
493-
bdev->bd_disk = disk;
494493
bdev->bd_partno = partno;
495494
bdev->bd_inode = inode;
496495
bdev->bd_stats = alloc_percpu(struct disk_stats);
497496
if (!bdev->bd_stats) {
498497
iput(inode);
499498
return NULL;
500499
}
500+
bdev->bd_disk = disk;
501501
return bdev;
502502
}
503503

block/genhd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
12681268

12691269
out_destroy_part_tbl:
12701270
xa_destroy(&disk->part_tbl);
1271+
disk->part0->bd_disk = NULL;
12711272
iput(disk->part0->bd_inode);
12721273
out_free_bdi:
12731274
bdi_put(disk->bdi);

0 commit comments

Comments
 (0)