Re: [PATCH] hwmon: corsair-psu: fix possible out-of-bounds access on missing string termination
[email protected] Wed, 05 Aug 2026 07:30:33 +0000
| Newsgroups | org.kernel.vger.linux-hwmon |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 1 potential issue(= s) to consider: Pre-existing issues: - [High] Data race on shared `priv->cmd_buffer` and `priv->wait_completion`= due to missing driver-level locking for debugfs attributes. -- --- Patch [1]: [PATCH] hwmon: corsair-psu: fix possible out-of-bounds acces= s on missing string termination --- commit cfc2e894e816ca1d7330d9074123e16e3ad443b7 Author: Wilken Gottwalt <[email protected]> hwmon: corsair-psu: fix possible out-of-bounds access on missing string ter= mination This commit limits the debugfs seq_printf() calls for vendor and product strings to a maximum length of REPLY_SIZE. This prevents potential out-of-bounds accesses if the strings are not properly null-terminated by the hardware. > diff --git a/drivers/hwmon/corsair-psu.c b/drivers/hwmon/corsair-psu.c > index ce958cdaef58a..3c01ae3fc4af2 100644 > --- a/drivers/hwmon/corsair-psu.c > +++ b/drivers/hwmon/corsair-psu.c > @@ -701,7 +701,7 @@ static int vendor_show(struct seq_file *seqf, void *u= nused) > { > struct corsairpsu_data *priv =3D seqf->private; > =20 > - seq_printf(seqf, "%s\n", priv->vendor); > + seq_printf(seqf, "%.*s\n", REPLY_SIZE, priv->vendor); > =20 > return 0; > } > @@ -711,7 +711,7 @@ static int product_show(struct seq_file *seqf, void *= unused) > { > struct corsairpsu_data *priv =3D seqf->private; > =20 > - seq_printf(seqf, "%s\n", priv->product); > + seq_printf(seqf, "%.*s\n", REPLY_SIZE, priv->product); > =20 > return 0; > } [Severity: High] This is a pre-existing issue, but does the lack of driver-level locking cause a data race on priv->cmd_buffer and priv->wait_completion when debugfs attributes are read concurrently with sysfs attributes? Looking at print_uptime(), it calls into corsairpsu_get_value() bypassing the hwmon core sysfs locks: drivers/hwmon/corsair-psu.c:print_uptime() { ... ret =3D corsairpsu_get_value(priv, cmd, 0, &val); ... } This proceeds into corsairpsu_usb_cmd() where the shared buffer and completion are mutated without any synchronization lock: drivers/hwmon/corsair-psu.c:corsairpsu_usb_cmd() { ... memset(priv->cmd_buffer, 0, CMD_BUFFER_SIZE); priv->cmd_buffer[0] =3D p0; priv->cmd_buffer[1] =3D p1; priv->cmd_buffer[2] =3D p2; reinit_completion(&priv->wait_completion); ... } The hwmon subsystem requires drivers to implement internal locking for attributes registered outside the core, such as debugfs interfaces. Without a transaction lock, interleaved USB commands can corrupt hardware state and result in mismatched telemetry data. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/anLj9gPWRoRDbQBV@mo= nster.localdomain?part=3D1