Skip to content

Commit 2749b75

Browse files
lgs2513kawasaki
authored andcommitted
floppy: fix reference leak on platform_device_register() failure
When platform_device_register() fails in do_floppy_init(), the embedded struct device in floppy_device[drive] has already been initialized by device_initialize(), but the failure path jumps to out_remove_drives without dropping the device reference for the current drive. Previously registered floppy devices are cleaned up in out_remove_drives, but the device for the drive that fails registration is not, leading to a reference leak. The issue was identified by a static analysis tool I developed and confirmed by manual review. Fix this by calling put_device() for the current floppy device before jumping to the common cleanup path. Fixes: 94fd0db ("[PATCH] Floppy: Add cmos attribute to floppy driver") Cc: stable@vger.kernel.org Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
1 parent 6b4d829 commit 2749b75

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

drivers/block/floppy.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4724,15 +4724,19 @@ static int __init do_floppy_init(void)
47244724
floppy_device[drive].dev.groups = floppy_dev_groups;
47254725

47264726
err = platform_device_register(&floppy_device[drive]);
4727-
if (err)
4727+
if (err) {
4728+
platform_device_put(&floppy_device[drive]);
47284729
goto out_remove_drives;
4729-
4730+
}
47304731
registered[drive] = true;
47314732

47324733
err = device_add_disk(&floppy_device[drive].dev,
47334734
disks[drive][0], NULL);
4734-
if (err)
4735+
if (err) {
4736+
platform_device_unregister(&floppy_device[drive]);
4737+
registered[drive] = false;
47354738
goto out_remove_drives;
4739+
}
47364740
}
47374741

47384742
return 0;

0 commit comments

Comments
 (0)