EDAC/sysfs: Fix memory leak when creating a csrow object [Linux 5.3]

This Linux kernel change "EDAC/sysfs: Fix memory leak when creating a csrow object" is included in the Linux 5.3 release. This change is authored by Pan Bian <bianpan2016 [at] 163.com> on Thu Apr 18 10:27:18 2019 +0800. The commit for this change in Linux stable tree is 585fb3d (patch).

EDAC/sysfs: Fix memory leak when creating a csrow object

In edac_create_csrow_object(), the reference to the object is not
released when adding the device to the device hierarchy fails
(device_add()). This may result in a memory leak.

Signed-off-by: Pan Bian <bianpan2016@163.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: James Morse <james.morse@arm.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: https://lkml.kernel.org/r/1555554438-103953-1-git-send-email-bianpan2016@163.com

There are 8 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/edac/edac_mc_sysfs.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 4641746..9b7d396 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -404,6 +404,8 @@ static inline int nr_pages_per_csrow(struct csrow_info *csrow)
 static int edac_create_csrow_object(struct mem_ctl_info *mci,
                    struct csrow_info *csrow, int index)
+   int err;
    csrow->dev.type = &csrow_attr_type;
    csrow->dev.groups = csrow_dev_groups;
@@ -415,7 +417,11 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci,
    edac_dbg(0, "creating (virtual) csrow node %s\n",

-   return device_add(&csrow->dev);
+   err = device_add(&csrow->dev);
+   if (err)
+       put_device(&csrow->dev);
+   return err;

 /* Create a CSROW object under specifed edac_mc_device */

Leave a Reply

Your email address will not be published. Required fields are marked *