mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
hwmon: (gigabyte_waterforce) reject short input reports
The HID raw_event callback runs before HID core validates the received
report length. waterforce_raw_event() reads command bytes and then accesses
fixed offsets for firmware or status data without any length checks. A
truncated report can therefore cause out-of-bounds reads and update hwmon
state with unrelated data.
Require every report to contain the firmware response fields, which also
covers both command bytes. After identifying a status response, require
the byte at the highest status offset before accessing its payload.
Fixes: 42ac68e3d4 ("hwmon: Add driver for Gigabyte AORUS Waterforce AIO coolers")
Cc: stable@vger.kernel.org
Signed-off-by: Jiale Yao <yaojiale02@163.com>
Link: https://patch.msgid.link/20260927084959.893708-1-yaojiale02@163.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
37c1974a0e
commit
400be69515
|
|
@ -257,6 +257,9 @@ static int waterforce_raw_event(struct hid_device *hdev, struct hid_report *repo
|
|||
{
|
||||
struct waterforce_data *priv = hid_get_drvdata(hdev);
|
||||
|
||||
if (size <= FIRMWARE_VER_START_OFFSET_2)
|
||||
return 0;
|
||||
|
||||
if (data[0] == get_firmware_ver_cmd[0] && data[1] == get_firmware_ver_cmd[1]) {
|
||||
/* Received a firmware version report */
|
||||
priv->firmware_version =
|
||||
|
|
@ -269,6 +272,8 @@ static int waterforce_raw_event(struct hid_device *hdev, struct hid_report *repo
|
|||
|
||||
if (data[0] != get_status_cmd[0] || data[1] != get_status_cmd[1])
|
||||
return 0;
|
||||
if (size <= WATERFORCE_TEMP_SENSOR)
|
||||
return 0;
|
||||
|
||||
priv->temp_input[0] = data[WATERFORCE_TEMP_SENSOR] * 1000;
|
||||
priv->speed_input[0] = get_unaligned_le16(data + WATERFORCE_FAN_SPEED);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user