Re: [PATCH] hwmon: (nzxt-smart2) Check return value of init_device() in probe

From: Guenter Roeck

Date: Tue Aug 04 2026 - 17:09:27 EST


On Tue, Aug 04, 2026 at 03:48:42PM +0800, Qingshuang Fu wrote:
> From: Qingshuang Fu <fuqingshuang@xxxxxxxxxx>
>
> The init_device() call in nzxt_smart2_hid_probe() can fail because it
> sends HID output reports to the hardware to detect fans and set the
> update interval. If the hardware is not responding or the HID reports
> fail, init_device() returns a negative error code.
>
> However, the return value was ignored, causing the probe to continue
> and register an hwmon device even though the device was never properly
> initialized. This leads to an inconsistent state where the driver
> reports stale data or blocks on wait queues that will never be woken.
>
> The same function's return value is already checked in the
> reset_resume() handler, confirming the author's intent that errors
> should be propagated.
>
> Note that this fix was not possible before commit 59d104b54b0b
> ("hwmon: (nzxt-smart2) Stop device IO before calling hid_hw_stop")
> because the out_hw_close error path was missing hid_device_io_stop(),
> which would have opened a use-after-free risk window.
>
> Fixes: 53e68c20aeb1 ("hwmon: add driver for NZXT RGB&Fan Controller/Smart Device v2.")
> Signed-off-by: Qingshuang Fu <fuqingshuang@xxxxxxxxxx>

Applied.

Thanks,
Guenter

> ---
> drivers/hwmon/nzxt-smart2.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
>
> base-commit: 848acc8ffe1b7cd5f1bf427b93069becfebc2c9d
>
> diff --git a/drivers/hwmon/nzxt-smart2.c b/drivers/hwmon/nzxt-smart2.c
> index ff0c0bee0e83..efc78a8f58c8 100644
> --- a/drivers/hwmon/nzxt-smart2.c
> +++ b/drivers/hwmon/nzxt-smart2.c
> @@ -754,7 +754,11 @@ static int nzxt_smart2_hid_probe(struct hid_device *hdev,
>
> hid_device_io_start(hdev);
>
> - init_device(drvdata, UPDATE_INTERVAL_DEFAULT_MS);
> + ret = init_device(drvdata, UPDATE_INTERVAL_DEFAULT_MS);
> + if (ret) {
> + dev_err(&hdev->dev, "init_device failed: %d\n", ret);
> + goto out_hw_close;
> + }
>
> drvdata->hwmon =
> hwmon_device_register_with_info(&hdev->dev, "nzxtsmart2", drvdata,