hwmon: (axi-fan-control) Fix possible NULL pointer dereference
authorDragos Bogdan <dragos.bogdan@analog.com>
Wed, 25 Oct 2023 13:21:00 +0000 (15:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:07 +0000 (11:59 +0100)
[ Upstream commit 2a5b3370a1d9750eca325292e291c8c7cb8cf2e0 ]

axi_fan_control_irq_handler(), dependent on the private
axi_fan_control_data structure, might be called before the hwmon
device is registered. That will cause an "Unable to handle kernel
NULL pointer dereference" error.

Fixes: 8412b410fa5e ("hwmon: Support ADI Fan Control IP")
Signed-off-by: Dragos Bogdan <dragos.bogdan@analog.com>
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20231025132100.649499-1-nuno.sa@analog.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hwmon/axi-fan-control.c

index 5fd136b..19b9bf3 100644 (file)
@@ -496,6 +496,21 @@ static int axi_fan_control_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       ret = axi_fan_control_init(ctl, pdev->dev.of_node);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to initialize device\n");
+               return ret;
+       }
+
+       ctl->hdev = devm_hwmon_device_register_with_info(&pdev->dev,
+                                                        name,
+                                                        ctl,
+                                                        &axi_chip_info,
+                                                        axi_fan_control_groups);
+
+       if (IS_ERR(ctl->hdev))
+               return PTR_ERR(ctl->hdev);
+
        ctl->irq = platform_get_irq(pdev, 0);
        if (ctl->irq < 0)
                return ctl->irq;
@@ -509,19 +524,7 @@ static int axi_fan_control_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = axi_fan_control_init(ctl, pdev->dev.of_node);
-       if (ret) {
-               dev_err(&pdev->dev, "Failed to initialize device\n");
-               return ret;
-       }
-
-       ctl->hdev = devm_hwmon_device_register_with_info(&pdev->dev,
-                                                        name,
-                                                        ctl,
-                                                        &axi_chip_info,
-                                                        axi_fan_control_groups);
-
-       return PTR_ERR_OR_ZERO(ctl->hdev);
+       return 0;
 }
 
 static struct platform_driver axi_fan_control_driver = {