Add the missing platform_device_unregister() before return from amiga_init_devices() in the error handling case. Fixes: eeed227966da ("m68k/amiga: Add error checks when registering platform devices") Reported-by: Hulk Robot <hulkci@xxxxxxxxxx> Signed-off-by: Yang Yingliang <yangyingliang@xxxxxxxxxx> --- arch/m68k/amiga/platform.c | 99 ++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 26 deletions(-) diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c index d34029d7b058..29fc296abf70 100644 --- a/arch/m68k/amiga/platform.c +++ b/arch/m68k/amiga/platform.c @@ -131,10 +131,14 @@ static const struct resource amiga_rtc_resource __initconst = { }; +#define AMIGA_PLATFORM_DEVICES 13 + static int __init amiga_init_devices(void) { struct platform_device *pdev; + struct platform_device *pdevs[AMIGA_PLATFORM_DEVICES]; int error; + int i = 0; if (!MACH_IS_AMIGA) return -ENODEV; @@ -145,6 +149,7 @@ static int __init amiga_init_devices(void) 0); if (IS_ERR(pdev)) return PTR_ERR(pdev); + pdevs[i++] = pdev; } @@ -152,8 +157,11 @@ static int __init amiga_init_devices(void) if (AMIGAHW_PRESENT(AMI_AUDIO)) { pdev = platform_device_register_simple("amiga-audio", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } @@ -161,46 +169,61 @@ static int __init amiga_init_devices(void) if (AMIGAHW_PRESENT(AMI_FLOPPY)) { pdev = platform_device_register_simple("amiga-floppy", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(A3000_SCSI)) { pdev = platform_device_register_simple("amiga-a3000-scsi", -1, &a3000_scsi_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(A4000_SCSI)) { pdev = platform_device_register_simple("amiga-a4000t-scsi", -1, &a4000t_scsi_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(A1200_IDE) || z_dev_present(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE)) { pdev = platform_device_register_simple("amiga-gayle-ide", -1, &a1200_ide_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } error = platform_device_add_data(pdev, &a1200_ide_pdata, sizeof(a1200_ide_pdata)); if (error) - return error; + goto err_unregister_pdevs; + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(A4000_IDE)) { pdev = platform_device_register_simple("amiga-gayle-ide", -1, &a4000_ide_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } error = platform_device_add_data(pdev, &a4000_ide_pdata, sizeof(a4000_ide_pdata)); if (error) - return error; + goto err_unregister_pdevs; + pdevs[i++] = pdev; } @@ -208,29 +231,41 @@ static int __init amiga_init_devices(void) if (AMIGAHW_PRESENT(AMI_KEYBOARD)) { pdev = platform_device_register_simple("amiga-keyboard", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(AMI_MOUSE)) { pdev = platform_device_register_simple("amiga-mouse", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(AMI_SERIAL)) { pdev = platform_device_register_simple("amiga-serial", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(AMI_PARALLEL)) { pdev = platform_device_register_simple("amiga-parallel", -1, NULL, 0); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } @@ -238,18 +273,30 @@ static int __init amiga_init_devices(void) if (AMIGAHW_PRESENT(A2000_CLK)) { pdev = platform_device_register_simple("rtc-msm6242", -1, &amiga_rtc_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } if (AMIGAHW_PRESENT(A3000_CLK)) { pdev = platform_device_register_simple("rtc-rp5c01", -1, &amiga_rtc_resource, 1); - if (IS_ERR(pdev)) - return PTR_ERR(pdev); + if (IS_ERR(pdev)) { + error = PTR_ERR(pdev); + goto err_unregister_pdevs; + } + pdevs[i++] = pdev; } return 0; + +err_unregister_pdevs: + while (i > 0) + platform_device_unregister(pdevs[--i]); + + return error; } arch_initcall(amiga_init_devices); -- 2.25.1