From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Borislav Petkov <bp@alien8.de>
Cc: PanBian <bianpan2016@163.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
James Morse <james.morse@arm.com>,
linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: EDAC: Fix memory leak in creating CSROW object
Date: Sat, 27 Apr 2019 23:49:25 +0200 [thread overview]
Message-ID: <20190427214925.GE16338@kroah.com> (raw)
On Fri, Apr 19, 2019 at 02:45:16AM +0200, Borislav Petkov wrote:
> On Fri, Apr 19, 2019 at 08:35:36AM +0800, PanBian wrote:
> > Yes, I see that. Because the loop start with (--i), there is no put
> > operation for the device that fails to create. So, I think we cannot
> > rule out the possibility of memory leak.
>
> Ok, so this is not something you trigger - you're basically staring at
> the code?
>
> Well, there's something else questionable in that code which I asked
> Greg about today but we didn't finish that conversation, let me CC him.
>
> So AFAIU, devices for which device_add() has returned success,
> should be removed with their counterpart device_del().
> edac_create_csrow_objects(), however, does put_device() on those in the
> "unwinding" loop.
>
> And for the case where device_add() fails, you should do put_device() to
> it. I.e., what you're saying.
>
> So I think we need to figure what needs to be done when before fixing
> this properly.
>
> Greg?
How about this patch, I think it fixes up everything you need to do
here, right?
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 464174685589..0fb2d1de6d0e 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 retval;
+
csrow->dev.type = &csrow_attr_type;
csrow->dev.groups = csrow_dev_groups;
device_initialize(&csrow->dev);
@@ -415,7 +417,10 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci,
edac_dbg(0, "creating (virtual) csrow node %s\n",
dev_name(&csrow->dev));
- return device_add(&csrow->dev);
+ retval = device_add(&csrow->dev);
+ if (retval)
+ put_device(&csrow->dev);
+ return retval;
}
/* Create a CSROW object under specifed edac_mc_device */
@@ -649,6 +654,8 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci,
edac_dbg(0, "creating rank/dimm device %s\n", dev_name(&dimm->dev));
+ if (err)
+ put_device(&dimm->dev);
return err;
}
@@ -928,6 +935,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
err = device_add(&mci->dev);
if (err < 0) {
edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev));
+ put_device(mci->dev);
goto out;
}
WARNING: multiple messages have this Message-ID (diff)
From: Greg KH <gregkh@linuxfoundation.org>
To: Borislav Petkov <bp@alien8.de>
Cc: PanBian <bianpan2016@163.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
James Morse <james.morse@arm.com>,
linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: EDAC: Fix memory leak in creating CSROW object
Date: Sat, 27 Apr 2019 23:49:25 +0200 [thread overview]
Message-ID: <20190427214925.GE16338@kroah.com> (raw)
Message-ID: <20190427214925.t5LN2ZRHFAuckYIz1rlFCtmzcrcTff-UXR05JkPkzRc@z> (raw)
In-Reply-To: <20190419004516.GC559@zn.tnic>
On Fri, Apr 19, 2019 at 02:45:16AM +0200, Borislav Petkov wrote:
> On Fri, Apr 19, 2019 at 08:35:36AM +0800, PanBian wrote:
> > Yes, I see that. Because the loop start with (--i), there is no put
> > operation for the device that fails to create. So, I think we cannot
> > rule out the possibility of memory leak.
>
> Ok, so this is not something you trigger - you're basically staring at
> the code?
>
> Well, there's something else questionable in that code which I asked
> Greg about today but we didn't finish that conversation, let me CC him.
>
> So AFAIU, devices for which device_add() has returned success,
> should be removed with their counterpart device_del().
> edac_create_csrow_objects(), however, does put_device() on those in the
> "unwinding" loop.
>
> And for the case where device_add() fails, you should do put_device() to
> it. I.e., what you're saying.
>
> So I think we need to figure what needs to be done when before fixing
> this properly.
>
> Greg?
How about this patch, I think it fixes up everything you need to do
here, right?
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 464174685589..0fb2d1de6d0e 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 retval;
+
csrow->dev.type = &csrow_attr_type;
csrow->dev.groups = csrow_dev_groups;
device_initialize(&csrow->dev);
@@ -415,7 +417,10 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci,
edac_dbg(0, "creating (virtual) csrow node %s\n",
dev_name(&csrow->dev));
- return device_add(&csrow->dev);
+ retval = device_add(&csrow->dev);
+ if (retval)
+ put_device(&csrow->dev);
+ return retval;
}
/* Create a CSROW object under specifed edac_mc_device */
@@ -649,6 +654,8 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci,
edac_dbg(0, "creating rank/dimm device %s\n", dev_name(&dimm->dev));
+ if (err)
+ put_device(&dimm->dev);
return err;
}
@@ -928,6 +935,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
err = device_add(&mci->dev);
if (err < 0) {
edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev));
+ put_device(mci->dev);
goto out;
}
next prev reply other threads:[~2019-04-27 21:49 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-18 2:27 EDAC: Fix memory leak in creating CSROW object Pan Bian
2019-04-18 2:27 ` Pan Bian
2019-04-18 17:25 ` Borislav Petkov
2019-04-18 17:25 ` Borislav Petkov
[not found] ` <20190419003536.GA57795@bianpan2016@163.com>
2019-04-19 0:45 ` Borislav Petkov
2019-04-19 0:45 ` Borislav Petkov
2019-04-27 21:49 ` Greg Kroah-Hartman [this message]
2019-04-27 21:49 ` Greg KH
2019-05-08 10:57 ` Borislav Petkov
2019-05-08 12:47 ` Greg KH
2019-05-08 18:50 ` Borislav Petkov
2019-05-08 11:02 ` [PATCH 1/2] EDAC/sysfs: Fix memory leak when creating a csrow object Borislav Petkov
2019-05-08 12:45 ` Greg KH
2019-05-08 11:06 ` [PATCH 2/2] EDAC/sysfs: Drop device references properly Borislav Petkov
2019-05-08 12:47 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190427214925.GE16338@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=bianpan2016@163.com \
--cc=bp@alien8.de \
--cc=james.morse@arm.com \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mchehab@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.