All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Wayen Yan" <win847@gmail.com>
Cc: linux-watchdog@vger.kernel.org
Subject: Re: [PATCH] watchdog: airoha: validate heartbeat module parameter
Date: Wed, 08 Jul 2026 05:36:42 +0000	[thread overview]
Message-ID: <20260708053643.6392B1F00ADF@smtp.kernel.org> (raw)
In-Reply-To: <178348833669.86438.10575372757097263872@gmail.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

New issues:
- [High] The patch removes the direct assignment of `wdog_dev->timeout = heartbeat;` to fix an overflow issue, and relies on `watchdog_init_timeout()` for validation. However, if the `heartbeat` parameter is invalid and there is no `timeout-sec` DT property, `watchdog_init_timeout()` returns `-EINVAL` and leaves `wdog_dev->timeout` unmodified. Because `wdog_dev` is allocated via `devm_kzalloc()`, `timeout` is 0. The driver ignores the `-EINVAL` return value and registers the watchdog with a timeout of 0. When `/dev/watchdog` is subsequently opened, `airoha_wdt_start()` writes `0 * airoha_wdt->wdt_freq` (0) to `WDT_TIMER_LOAD_VALUE`. This instantly expires the timer and triggers an immediate hardware reboot. The driver must pre-initialize `wdog_dev->timeout` to a valid default (e.g., `WDT_HEARTBEAT`) before calling `watchdog_init_timeout()`.

Pre-existing issues:
- [High] This problem wasn't introduced by this patch, but the driver leaves `wdog_dev->min_timeout` uninitialized (0). The watchdog core's `watchdog_timeout_invalid()` relies on `min_timeout` to validate lower bounds. With `min_timeout` set to 0, userspace can successfully execute `ioctl(WDIOC_SETTIMEOUT)` with a timeout of 0. The `airoha_wdt_set_timeout()` function assigns this 0 to `wdog_dev->timeout` and restarts the hardware timer. This causes `airoha_wdt_start()` to write 0 to the timer load register, which triggers an instantaneous hardware reset without proper shutdown. The driver should explicitly set `wdog_dev->min_timeout = 1`.
--

--- Patch [1]: [PATCH] watchdog: airoha: validate heartbeat module parameter ---
commit 1b1b24f68ee022a802b613038f9562b2f86dffc9
Author: Wayen Yan <win847@gmail.com>

watchdog: airoha: validate heartbeat module parameter

This patch replaces a direct assignment of the heartbeat module parameter
with a call to watchdog_init_timeout() to properly validate the timeout
range. This prevents an integer overflow in the timer load calculation
that could otherwise cause the watchdog to expire immediately.

> diff --git a/drivers/watchdog/airoha_wdt.c b/drivers/watchdog/airoha_wdt.c
> index dc8ca11c14d81..67160d760d844 100644
> --- a/drivers/watchdog/airoha_wdt.c
> +++ b/drivers/watchdog/airoha_wdt.c
> @@ -150,13 +150,13 @@ static int airoha_wdt_probe(struct platform_device *pdev)
>  
>  	/* Initialize struct watchdog device */
>  	wdog_dev = &airoha_wdt->wdog_dev;
> -	wdog_dev->timeout = heartbeat;
>  	wdog_dev->info = &airoha_wdt_info;
>  	wdog_dev->ops = &airoha_wdt_ops;
>  	/* Bus 300MHz, watchdog 150MHz, 28 seconds */
>  	wdog_dev->max_timeout = FIELD_MAX(WDT_TIMER_VAL) / airoha_wdt->wdt_freq;
>  	wdog_dev->parent = dev;

[Severity: High]
This is a pre-existing issue, but should the driver also explicitly 
initialize wdog_dev->min_timeout?

Because min_timeout is currently left uninitialized (0), the watchdog core's
watchdog_timeout_invalid() function allows a timeout of 0. If userspace
calls ioctl(WDIOC_SETTIMEOUT) with 0, airoha_wdt_set_timeout() will assign 0
to wdog_dev->timeout.

This results in airoha_wdt_start() writing 0 to the timer load register,
which triggers an immediate, ungraceful hardware reset:

drivers/watchdog/airoha_wdt.c:airoha_wdt_start() {
        ...
        val = wdog_dev->timeout * airoha_wdt->wdt_freq;
        writel(val, airoha_wdt->base + REG_WDT_TIMER_LOAD_VALUE);
        ...
}

Setting wdog_dev->min_timeout = 1 would prevent userspace from configuring a
zero timeout.

> +	watchdog_init_timeout(wdog_dev, heartbeat, dev);

[Severity: High]
If watchdog_init_timeout() fails, does this leave wdog_dev->timeout set 
to 0?

The kzalloc allocation zero-initializes wdog_dev, and the patch removes
the direct assignment of wdog_dev->timeout. If the heartbeat parameter is
invalid and there is no timeout-sec device tree property, 
watchdog_init_timeout() returns -EINVAL and leaves wdog_dev->timeout as 0.

Because the return value is ignored, the watchdog registers successfully.
When a userspace daemon subsequently opens /dev/watchdog, airoha_wdt_start() 
runs:

drivers/watchdog/airoha_wdt.c:airoha_wdt_start() {
        ...
        val = wdog_dev->timeout * airoha_wdt->wdt_freq;
        writel(val, airoha_wdt->base + REG_WDT_TIMER_LOAD_VALUE);
        ...
}

This calculates a load value of 0, immediately expiring the timer and
rebooting the system.

Would it be better to initialize wdog_dev->timeout to a valid default
value before calling watchdog_init_timeout(), or explicitly handle the 
error return value?

>  	watchdog_set_drvdata(wdog_dev, airoha_wdt);
>  	watchdog_set_nowayout(wdog_dev, nowayout);
>  	watchdog_stop_on_unregister(wdog_dev);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/178348833669.86438.10575372757097263872@gmail.com?part=1

  reply	other threads:[~2026-07-08  5:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-08  5:24 [PATCH] watchdog: airoha: validate heartbeat module parameter Wayen Yan
2026-07-08  5:36 ` sashiko-bot [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-07-08  5:55 Wayen Yan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260708053643.6392B1F00ADF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-watchdog@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=win847@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.