forked from Minki/linux
floppy: fix calling platform_device_unregister() on invalid drives
platform_device_unregister() should only be called when a respective platform_device_register() is called. However the floppy driver currently allows failures when registring a drive and a bail out could easily cause an invalid call to platform_device_unregister() where it was not intended. Fix this by adding a bool to keep track of when the platform device was registered for a drive. This does not fix any known panic / bug. This issue was found through code inspection while preparing the driver to use the up and coming support for device_add_disk() error handling. From what I can tell from code inspection, chances of this ever happening should be insanely small, perhaps OOM. Signed-off-by: Luis Chamberlain <mcgrof@kernel.org> Link: https://lore.kernel.org/r/20210927220302.1073499-5-mcgrof@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
3776339ae7
commit
662167e59d
@ -4479,6 +4479,7 @@ static const struct blk_mq_ops floppy_mq_ops = {
|
||||
};
|
||||
|
||||
static struct platform_device floppy_device[N_DRIVE];
|
||||
static bool registered[N_DRIVE];
|
||||
|
||||
static bool floppy_available(int drive)
|
||||
{
|
||||
@ -4694,6 +4695,8 @@ static int __init do_floppy_init(void)
|
||||
if (err)
|
||||
goto out_remove_drives;
|
||||
|
||||
registered[drive] = true;
|
||||
|
||||
device_add_disk(&floppy_device[drive].dev, disks[drive][0],
|
||||
NULL);
|
||||
}
|
||||
@ -4704,7 +4707,8 @@ out_remove_drives:
|
||||
while (drive--) {
|
||||
if (floppy_available(drive)) {
|
||||
del_gendisk(disks[drive][0]);
|
||||
platform_device_unregister(&floppy_device[drive]);
|
||||
if (registered[drive])
|
||||
platform_device_unregister(&floppy_device[drive]);
|
||||
}
|
||||
}
|
||||
out_release_dma:
|
||||
@ -4947,7 +4951,8 @@ static void __exit floppy_module_exit(void)
|
||||
if (disks[drive][i])
|
||||
del_gendisk(disks[drive][i]);
|
||||
}
|
||||
platform_device_unregister(&floppy_device[drive]);
|
||||
if (registered[drive])
|
||||
platform_device_unregister(&floppy_device[drive]);
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(floppy_type); i++) {
|
||||
if (disks[drive][i])
|
||||
|
Loading…
Reference in New Issue
Block a user