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.

Signed-off-by: Luis R. Rodriguez <[email protected]>
---
 drivers/base/firmware_loader.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/base/firmware_loader.c b/drivers/base/firmware_loader.c
index 5f3d44d0bfe0..99c540164074 100644
--- a/drivers/base/firmware_loader.c
+++ b/drivers/base/firmware_loader.c
@@ -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;
@@ -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);
@@ -769,6 +777,9 @@ 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))
+               return -EOPNOTSUPP;
+
        if (!try_module_get(module)) {
                kfree_const(fw_work->name);
                kfree(fw_work);
-- 
2.16.2

Reply via email to