ipmi_si: Fix error handling of platform device
authorCorey Minyard <cminyard@mvista.com>
Mon, 27 Nov 2017 14:18:33 +0000 (08:18 -0600)
committerCorey Minyard <cminyard@mvista.com>
Tue, 12 Dec 2017 13:02:32 +0000 (07:02 -0600)
Cleanup of platform devices created by the IPMI driver was not
being done correctly and could result in a memory leak.  So
create a local boolean to know how to clean up those platform
devices.

Reported-by: David Binderman <dcb314@hotmail.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_si_intf.c

index 71fad747c0c7c1052cc19ee3bad0568b4a80c55b..7499b0cd8326f701a8fd136d70cd9f07c3fc3162 100644 (file)
@@ -2045,6 +2045,7 @@ static int try_smi_init(struct smi_info *new_smi)
        int rv = 0;
        int i;
        char *init_name = NULL;
+       bool platform_device_registered = false;
 
        pr_info(PFX "Trying %s-specified %s state machine at %s address 0x%lx, slave address 0x%x, irq %d\n",
                ipmi_addr_src_to_str(new_smi->io.addr_source),
@@ -2173,6 +2174,7 @@ static int try_smi_init(struct smi_info *new_smi)
                                rv);
                        goto out_err;
                }
+               platform_device_registered = true;
        }
 
        dev_set_drvdata(new_smi->io.dev, new_smi);
@@ -2279,10 +2281,11 @@ out_err:
        }
 
        if (new_smi->pdev) {
-               platform_device_unregister(new_smi->pdev);
+               if (platform_device_registered)
+                       platform_device_unregister(new_smi->pdev);
+               else
+                       platform_device_put(new_smi->pdev);
                new_smi->pdev = NULL;
-       } else if (new_smi->pdev) {
-               platform_device_put(new_smi->pdev);
        }
 
        kfree(init_name);