lkml.org 
[lkml]   [2020]   [Sep]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 067/127] rtc: ds1374: fix possible race condition
    Date
    From: Alexandre Belloni <alexandre.belloni@bootlin.com>

    [ Upstream commit c11af8131a4e7ba1960faed731ee7e84c2c13c94 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/rtc/rtc-ds1374.c | 15 +++++++++------
    1 file changed, 9 insertions(+), 6 deletions(-)

    diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c
    index 38a2e9e684df4..77a106e90124b 100644
    --- a/drivers/rtc/rtc-ds1374.c
    +++ b/drivers/rtc/rtc-ds1374.c
    @@ -620,6 +620,10 @@ static int ds1374_probe(struct i2c_client *client,
    if (!ds1374)
    return -ENOMEM;

    + ds1374->rtc = devm_rtc_allocate_device(&client->dev);
    + if (IS_ERR(ds1374->rtc))
    + return PTR_ERR(ds1374->rtc);
    +
    ds1374->client = client;
    i2c_set_clientdata(client, ds1374);

    @@ -641,12 +645,11 @@ static int ds1374_probe(struct i2c_client *client,
    device_set_wakeup_capable(&client->dev, 1);
    }

    - ds1374->rtc = devm_rtc_device_register(&client->dev, client->name,
    - &ds1374_rtc_ops, THIS_MODULE);
    - if (IS_ERR(ds1374->rtc)) {
    - dev_err(&client->dev, "unable to register the class device\n");
    - return PTR_ERR(ds1374->rtc);
    - }
    + ds1374->rtc->ops = &ds1374_rtc_ops;
    +
    + ret = rtc_register_device(ds1374->rtc);
    + if (ret)
    + return ret;

    #ifdef CONFIG_RTC_DRV_DS1374_WDT
    save_client = client;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-09-18 04:34    [W:4.343 / U:0.516 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site