mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
fw_load_sysfs_fallback() calls device_add() before adding the fw_priv to
pending_fw_head. device_add() publishes the fallback loading interface, so
a userspace helper which discovers the device by scanning sysfs can write 0
to the loading attribute and complete the request before it is queued as
pending.
In that interleaving firmware_loading_store() calls fw_state_done() while
pending_list still points to itself, so it cannot remove an entry from
pending_fw_head. The subsequent unconditional list_add() then queues an
already-completed fw_priv. Once the request is released, pending_fw_head
can retain a pointer to freed memory and the next fallback request can
fault while validating the list.
Only in-flight fallback requests need suspend or reboot abort handling. If
the request is already DONE after device_add(), return success from the
fallback path without sending another uevent, waiting again, or queueing it
as pending. This preserves the invariant that pending_fw_head contains only
active fallback requests.
Fixes:
|
||
|---|---|---|
| .. | ||
| builtin | ||
| fallback_platform.c | ||
| fallback_table.c | ||
| fallback.c | ||
| fallback.h | ||
| firmware.h | ||
| Kconfig | ||
| main.c | ||
| Makefile | ||
| sysfs_upload.c | ||
| sysfs_upload.h | ||
| sysfs.c | ||
| sysfs.h | ||