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

Guenter Roeck <[email protected]> Tue, 4 Aug 2026 14:08:14 -0700
Newsgroups org.kernel.vger.linux-hwmon,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Tue, Aug 04, 2026 at 03:48:42PM +0800, Qingshuang Fu wrote:
> From: Qingshuang Fu <[email protected]>
> 
> 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 <[email protected]>

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,