firmware_loader: Fix memory leak in firmware upload
authorRuss Weight <russell.h.weight@intel.com>
Wed, 31 Aug 2022 00:25:18 +0000 (17:25 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Sep 2022 15:47:27 +0000 (17:47 +0200)
In the case of firmware-upload, an instance of struct fw_upload is
allocated in firmware_upload_register(). This data needs to be freed
in fw_dev_release(). Create a new fw_upload_free() function in
sysfs_upload.c to handle the firmware-upload specific memory frees
and incorporate the missing kfree call for the fw_upload structure.

Fixes: 97730bbb242c ("firmware_loader: Add firmware-upload support")
Cc: stable <stable@kernel.org>
Signed-off-by: Russ Weight <russell.h.weight@intel.com>
Link: https://lore.kernel.org/r/20220831002518.465274-1-russell.h.weight@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/firmware_loader/sysfs.c
drivers/base/firmware_loader/sysfs.h
drivers/base/firmware_loader/sysfs_upload.c

index 77bad32..5b66b3d 100644 (file)
@@ -93,10 +93,9 @@ static void fw_dev_release(struct device *dev)
 {
        struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
 
-       if (fw_sysfs->fw_upload_priv) {
-               free_fw_priv(fw_sysfs->fw_priv);
-               kfree(fw_sysfs->fw_upload_priv);
-       }
+       if (fw_sysfs->fw_upload_priv)
+               fw_upload_free(fw_sysfs);
+
        kfree(fw_sysfs);
 }
 
index 5d8ff16..df1d5ad 100644 (file)
@@ -106,12 +106,17 @@ extern struct device_attribute dev_attr_cancel;
 extern struct device_attribute dev_attr_remaining_size;
 
 int fw_upload_start(struct fw_sysfs *fw_sysfs);
+void fw_upload_free(struct fw_sysfs *fw_sysfs);
 umode_t fw_upload_is_visible(struct kobject *kobj, struct attribute *attr, int n);
 #else
 static inline int fw_upload_start(struct fw_sysfs *fw_sysfs)
 {
        return 0;
 }
+
+static inline void fw_upload_free(struct fw_sysfs *fw_sysfs)
+{
+}
 #endif
 
 #endif /* __FIRMWARE_SYSFS_H */
index 63e15bd..a0af8f5 100644 (file)
@@ -264,6 +264,15 @@ int fw_upload_start(struct fw_sysfs *fw_sysfs)
        return 0;
 }
 
+void fw_upload_free(struct fw_sysfs *fw_sysfs)
+{
+       struct fw_upload_priv *fw_upload_priv = fw_sysfs->fw_upload_priv;
+
+       free_fw_priv(fw_sysfs->fw_priv);
+       kfree(fw_upload_priv->fw_upload);
+       kfree(fw_upload_priv);
+}
+
 /**
  * firmware_upload_register() - register for the firmware upload sysfs API
  * @module: kernel module of this device