mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
HID: sensor: custom: Fix use-after-free in enable_sensor
enable_sensor_store() can call set_power_report_state(), which
dereferences sensor_inst->power_state and sensor_inst->report_state.
These pointers refer to entries in sensor_inst->fields.
Create the field attributes before exposing the enable_sensor sysfs
attribute, so enable_sensor cannot be accessed before the state it
depends on has been initialized.
On remove, delete enable_sensor before freeing the field attributes,
so a concurrent sysfs write cannot dereference freed memory through
power_state or report_state.
Reported-by: Sashiko AI Review <sashiko-bot@kernel.org>
Link: https://sashiko.dev/#/patchset/20260623021950.1736413-1-haoxiang_li2024@163.com?part=1
Fixes: 4a7de0519d ("HID: sensor: Custom and Generic sensor support")
Cc: stable@vger.kernel.org
Signed-off-by: Haoxiang Li <haoxiang_li2024@163.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
parent
3efb7f6491
commit
ad8fb82b04
|
|
@ -1005,26 +1005,26 @@ static int hid_sensor_custom_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = sysfs_create_group(&sensor_inst->pdev->dev.kobj,
|
||||
&enable_sensor_attr_group);
|
||||
ret = hid_sensor_custom_add_attributes(sensor_inst);
|
||||
if (ret)
|
||||
goto err_remove_callback;
|
||||
|
||||
ret = hid_sensor_custom_add_attributes(sensor_inst);
|
||||
if (ret)
|
||||
goto err_remove_group;
|
||||
|
||||
ret = hid_sensor_custom_dev_if_add(sensor_inst);
|
||||
ret = sysfs_create_group(&sensor_inst->pdev->dev.kobj,
|
||||
&enable_sensor_attr_group);
|
||||
if (ret)
|
||||
goto err_remove_attributes;
|
||||
|
||||
ret = hid_sensor_custom_dev_if_add(sensor_inst);
|
||||
if (ret)
|
||||
goto err_remove_group;
|
||||
|
||||
return 0;
|
||||
|
||||
err_remove_attributes:
|
||||
hid_sensor_custom_remove_attributes(sensor_inst);
|
||||
err_remove_group:
|
||||
sysfs_remove_group(&sensor_inst->pdev->dev.kobj,
|
||||
&enable_sensor_attr_group);
|
||||
err_remove_attributes:
|
||||
hid_sensor_custom_remove_attributes(sensor_inst);
|
||||
err_remove_callback:
|
||||
sensor_hub_remove_callback(hsdev, hsdev->usage);
|
||||
|
||||
|
|
@ -1042,9 +1042,10 @@ static void hid_sensor_custom_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
hid_sensor_custom_dev_if_remove(sensor_inst);
|
||||
hid_sensor_custom_remove_attributes(sensor_inst);
|
||||
/* Remove enable_sensor first as it uses fields via power_state/report_state. */
|
||||
sysfs_remove_group(&sensor_inst->pdev->dev.kobj,
|
||||
&enable_sensor_attr_group);
|
||||
hid_sensor_custom_remove_attributes(sensor_inst);
|
||||
sensor_hub_remove_callback(hsdev, hsdev->usage);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user