Skip to content

Commit

Permalink
firmware: ensure the firmware cache is not used on incompatible calls
Browse files Browse the repository at this point in the history
request_firmware_into_buf() explicitly disables the firmware cache,
meanwhile the firmware cache cannot be used when request_firmware_nowait()
is used without the uevent. Enforce a sanity check for this to avoid future
issues undocumented behaviours should misuses of the firmware cache
happen later.

One of the reasons we want to enforce this is the firmware cache is
used for helping with suspend/resume, and if incompatible calls use it
they can stall suspend.

Signed-off-by: Luis R. Rodriguez <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
mcgrof authored and gregkh committed Mar 20, 2018
1 parent 9952db7 commit 995e869
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions drivers/base/firmware_loader/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,11 @@ static int fw_add_devm_name(struct device *dev, const char *name)
return 0;
}
#else
static bool fw_cache_is_setup(struct device *dev, const char *name)
{
return false;
}

static int fw_add_devm_name(struct device *dev, const char *name)
{
return 0;
Expand Down Expand Up @@ -672,6 +677,9 @@ request_firmware_into_buf(const struct firmware **firmware_p, const char *name,
{
int ret;

if (fw_cache_is_setup(device, name))
return -EOPNOTSUPP;

__module_get(THIS_MODULE);
ret = _request_firmware(firmware_p, name, device, buf, size,
FW_OPT_UEVENT | FW_OPT_NOCACHE);
Expand Down Expand Up @@ -769,6 +777,12 @@ request_firmware_nowait(
fw_work->opt_flags = FW_OPT_NOWAIT |
(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);

if (!uevent && fw_cache_is_setup(device, name)) {
kfree_const(fw_work->name);
kfree(fw_work);
return -EOPNOTSUPP;
}

if (!try_module_get(module)) {
kfree_const(fw_work->name);
kfree(fw_work);
Expand Down

0 comments on commit 995e869

Please sign in to comment.