]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - drivers/mtd/nand/raw/atmel/pmecc.c
mtd: rawnand: atmel: fix possible object reference leak
[zynq/linux.git] / drivers / mtd / nand / raw / atmel / pmecc.c
index 555a74e15269da45f2b4685dcd149cfd88f47438..9d3997840889b2b3139e54ecbd0729cf507f74ae 100644 (file)
@@ -876,23 +876,32 @@ static struct atmel_pmecc *atmel_pmecc_get_by_node(struct device *userdev,
 {
        struct platform_device *pdev;
        struct atmel_pmecc *pmecc, **ptr;
+       int ret;
 
        pdev = of_find_device_by_node(np);
-       if (!pdev || !platform_get_drvdata(pdev))
+       if (!pdev)
                return ERR_PTR(-EPROBE_DEFER);
+       pmecc = platform_get_drvdata(pdev);
+       if (!pmecc) {
+               ret = -EPROBE_DEFER;
+               goto err_put_device;
+       }
 
        ptr = devres_alloc(devm_atmel_pmecc_put, sizeof(*ptr), GFP_KERNEL);
-       if (!ptr)
-               return ERR_PTR(-ENOMEM);
-
-       get_device(&pdev->dev);
-       pmecc = platform_get_drvdata(pdev);
+       if (!ptr) {
+               ret = -ENOMEM;
+               goto err_put_device;
+       }
 
        *ptr = pmecc;
 
        devres_add(userdev, ptr);
 
        return pmecc;
+
+err_put_device:
+       put_device(&pdev->dev);
+       return ERR_PTR(ret);
 }
 
 static const int atmel_pmecc_strengths[] = { 2, 4, 8, 12, 24, 32 };