lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 283/849] floppy: fix calling platform_device_unregister() on invalid drives
    Date
    From: Luis Chamberlain <mcgrof@kernel.org>

    [ Upstream commit 662167e59d2f3c15a44a88088fc6c1a67c8a3650 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/block/floppy.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
    index 9538146e520e0..3592a6277d0bb 100644
    --- a/drivers/block/floppy.c
    +++ b/drivers/block/floppy.c
    @@ -4478,6 +4478,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)
    {
    @@ -4693,6 +4694,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);
    }
    @@ -4703,7 +4706,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:
    @@ -4946,7 +4950,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])
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 02:40    [W:4.053 / U:0.756 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site