rtc: ds1374: fix possible race condition
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. Link: https://lore.kernel.org/r/20200306073404.56921-1-alexandre.belloni@bootlin.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
parent
d238df15e5
commit
c11af8131a
|
@ -620,6 +620,10 @@ static int ds1374_probe(struct i2c_client *client,
|
||||||
if (!ds1374)
|
if (!ds1374)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ds1374->rtc = devm_rtc_allocate_device(&client->dev);
|
||||||
|
if (IS_ERR(ds1374->rtc))
|
||||||
|
return PTR_ERR(ds1374->rtc);
|
||||||
|
|
||||||
ds1374->client = client;
|
ds1374->client = client;
|
||||||
i2c_set_clientdata(client, ds1374);
|
i2c_set_clientdata(client, ds1374);
|
||||||
|
|
||||||
|
@ -641,12 +645,11 @@ static int ds1374_probe(struct i2c_client *client,
|
||||||
device_set_wakeup_capable(&client->dev, 1);
|
device_set_wakeup_capable(&client->dev, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ds1374->rtc = devm_rtc_device_register(&client->dev, client->name,
|
ds1374->rtc->ops = &ds1374_rtc_ops;
|
||||||
&ds1374_rtc_ops, THIS_MODULE);
|
|
||||||
if (IS_ERR(ds1374->rtc)) {
|
ret = rtc_register_device(ds1374->rtc);
|
||||||
dev_err(&client->dev, "unable to register the class device\n");
|
if (ret)
|
||||||
return PTR_ERR(ds1374->rtc);
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_RTC_DRV_DS1374_WDT
|
#ifdef CONFIG_RTC_DRV_DS1374_WDT
|
||||||
save_client = client;
|
save_client = client;
|
||||||
|
|
Loading…
Reference in New Issue