[ldv-project] [PATCH] drivers: watchdog: rdc321x_wdt: Fix race condition bugs
Evgeny Novikov
novikov at ispras.ru
Fri Aug 7 21:30:58 MSK 2020
07.08.2020, 19:21, "Guenter Roeck" <linux at roeck-us.net>:
> On Fri, Aug 07, 2020 at 04:59:02PM +0530, madhuparnabhowmik10 at gmail.com wrote:
>> From: Madhuparna Bhowmik <madhuparnabhowmik10 at gmail.com>
>>
>> In rdc321x_wdt_probe(), rdc321x_wdt_device.queue is initialized
>> after misc_register(), hence if ioctl is called before its
>> initialization which can call rdc321x_wdt_start() function,
>> it will see an uninitialized value of rdc321x_wdt_device.queue,
>> hence initialize it before misc_register().
>> Also, rdc321x_wdt_device.default_ticks is accessed in reset()
>> function called from write callback, thus initialize it before
>> misc_register().
>>
>> Found by Linux Driver Verification project (linuxtesting.org).
>>
>> Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik10 at gmail.com>
>
> Reviewed-by: Guenter Roeck <linux at roeck-us.net>
>
> Having said that ... this is yet another potentially obsolete driver.
> You are really wasting your (and, fwiw, my) time.
Static analysis tools are not aware about obsolete drivers.
It would be great if there will be some formal way to filter them out.
Maybe some file will enumerate all obsolete drivers, or there will be
something within their source code, or something else.
--
Best regards,
Evgeny Novikov
>
> Florian, any thoughts if support for this chip can/should be deprecated
> or even removed ?
>
> Guenter
>
>> ---
>> drivers/watchdog/rdc321x_wdt.c | 5 ++---
>> 1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/watchdog/rdc321x_wdt.c b/drivers/watchdog/rdc321x_wdt.c
>> index 57187efeb86f..f0c94ea51c3e 100644
>> --- a/drivers/watchdog/rdc321x_wdt.c
>> +++ b/drivers/watchdog/rdc321x_wdt.c
>> @@ -231,6 +231,8 @@ static int rdc321x_wdt_probe(struct platform_device *pdev)
>>
>> rdc321x_wdt_device.sb_pdev = pdata->sb_pdev;
>> rdc321x_wdt_device.base_reg = r->start;
>> + rdc321x_wdt_device.queue = 0;
>> + rdc321x_wdt_device.default_ticks = ticks;
>>
>> err = misc_register(&rdc321x_wdt_misc);
>> if (err < 0) {
>> @@ -245,14 +247,11 @@ static int rdc321x_wdt_probe(struct platform_device *pdev)
>> rdc321x_wdt_device.base_reg, RDC_WDT_RST);
>>
>> init_completion(&rdc321x_wdt_device.stop);
>> - rdc321x_wdt_device.queue = 0;
>>
>> clear_bit(0, &rdc321x_wdt_device.inuse);
>>
>> timer_setup(&rdc321x_wdt_device.timer, rdc321x_wdt_trigger, 0);
>>
>> - rdc321x_wdt_device.default_ticks = ticks;
>> -
>> dev_info(&pdev->dev, "watchdog init success\n");
>>
>> return 0;
>> --
>> 2.17.1
>
> _______________________________________________
> ldv-project mailing list
> ldv-project at linuxtesting.org
> http://linuxtesting.org/cgi-bin/mailman/listinfo/ldv-project
More information about the ldv-project
mailing list