| From 093ddddd5c94c5300ce114157d18bbd0a35e045d Mon Sep 17 00:00:00 2001 |
| From: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Date: Wed, 11 Mar 2020 23:39:51 +0100 |
| Subject: [PATCH] rtc: 88pm860x: fix possible race condition |
| |
| commit 9cf4789e6e4673d0b2c96fa6bb0c35e81b43111a upstream. |
| |
| The RTC IRQ is requested before the struct rtc_device is allocated, |
| this may lead to a NULL pointer dereference in the IRQ handler. |
| |
| To fix this issue, allocating the rtc_device struct before requesting |
| the RTC IRQ using devm_rtc_allocate_device, and use rtc_register_device |
| to register the RTC device. |
| |
| Also remove the unnecessary error message as the core already prints the |
| info. |
| |
| Link: https://lore.kernel.org/r/20200311223956.51352-1-alexandre.belloni@bootlin.com |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c |
| index 434285f495e0..fb51f2b9b05e 100644 |
| --- a/drivers/rtc/rtc-88pm860x.c |
| +++ b/drivers/rtc/rtc-88pm860x.c |
| @@ -338,6 +338,10 @@ static int pm860x_rtc_probe(struct platform_device *pdev) |
| info->dev = &pdev->dev; |
| dev_set_drvdata(&pdev->dev, info); |
| |
| + info->rtc_dev = devm_rtc_allocate_device(&pdev->dev); |
| + if (IS_ERR(info->rtc_dev)) |
| + return PTR_ERR(info->rtc_dev); |
| + |
| ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, |
| rtc_update_handler, IRQF_ONESHOT, "rtc", |
| info); |
| @@ -379,13 +383,11 @@ static int pm860x_rtc_probe(struct platform_device *pdev) |
| } |
| } |
| |
| - info->rtc_dev = devm_rtc_device_register(&pdev->dev, "88pm860x-rtc", |
| - &pm860x_rtc_ops, THIS_MODULE); |
| - ret = PTR_ERR(info->rtc_dev); |
| - if (IS_ERR(info->rtc_dev)) { |
| - dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); |
| + info->rtc_dev->ops = &pm860x_rtc_ops; |
| + |
| + ret = rtc_register_device(info->rtc_dev); |
| + if (ret) |
| return ret; |
| - } |
| |
| /* |
| * enable internal XO instead of internal 3.25MHz clock since it can |
| -- |
| 2.7.4 |
| |