Skip to content

Commit 4af5c96

Browse files
committed
HID: intel-ish-hid: Fix use-after-free issue in ishtp_hid_remove()
JIRA: https://issues.redhat.com/browse/RHEL-94431 Upstream status: v6.15 commit 07583a0 Author: Zhang Lixu <lixu.zhang@intel.com> Date: Tue Feb 18 14:37:30 2025 +0800 HID: intel-ish-hid: Fix use-after-free issue in ishtp_hid_remove() The system can experience a random crash a few minutes after the driver is removed. This issue occurs due to improper handling of memory freeing in the ishtp_hid_remove() function. The function currently frees the `driver_data` directly within the loop that destroys the HID devices, which can lead to accessing freed memory. Specifically, `hid_destroy_device()` uses `driver_data` when it calls `hid_ishtp_set_feature()` to power off the sensor, so freeing `driver_data` beforehand can result in accessing invalid memory. This patch resolves the issue by storing the `driver_data` in a temporary variable before calling `hid_destroy_device()`, and then freeing the `driver_data` after the device is destroyed. Fixes: 0b28cb4 ("HID: intel-ish-hid: ISH HID client driver") Signed-off-by: Zhang Lixu <lixu.zhang@intel.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.com> Signed-off-by: Tony Camuso <tcamuso@redhat.com>
1 parent 1b4e8b8 commit 4af5c96

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/hid/intel-ish-hid/ishtp-hid.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,14 @@ int ishtp_hid_probe(unsigned int cur_hid_dev,
261261
*/
262262
void ishtp_hid_remove(struct ishtp_cl_data *client_data)
263263
{
264+
void *data;
264265
int i;
265266

266267
for (i = 0; i < client_data->num_hid_devices; ++i) {
267268
if (client_data->hid_sensor_hubs[i]) {
268-
kfree(client_data->hid_sensor_hubs[i]->driver_data);
269+
data = client_data->hid_sensor_hubs[i]->driver_data;
269270
hid_destroy_device(client_data->hid_sensor_hubs[i]);
271+
kfree(data);
270272
client_data->hid_sensor_hubs[i] = NULL;
271273
}
272274
}

0 commit comments

Comments
 (0)