Re: [PATCH] pcmcia:Fix memory leaks in the function, sa11xx_drv_pcmcia_probe

From: Larry Finger
Date: Wed Mar 25 2015 - 02:11:55 EST


On 03/24/2015 11:24 PM, Nicholas Krause wrote:
Fixes memory leaks in the function,sa11xx_drv_pcmcia_probe for
when either clk_get returns a error value or when we cannot allocate
memory with the pointer sinfo to memory required for this function
to continue and return successfully. Further more this was caught by
running coccinelle on the lastet kernel tree.

Signed-off-by: Nicholas Krause <xerofoify@xxxxxxxxx>
---
drivers/pcmcia/sa11xx_base.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c
index cf6de2c..a95ce73 100644
--- a/drivers/pcmcia/sa11xx_base.c
+++ b/drivers/pcmcia/sa11xx_base.c
@@ -223,14 +223,19 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
struct clk *clk;

clk = clk_get(dev, NULL);
- if (IS_ERR(clk))
+ if (IS_ERR(clk)) {
+ clk_put(clk);
return PTR_ERR(clk);
+ }

If the clk_get() failed, then there is no need to use a clk_put(). In addition, clk contains an error code, not a valid pointer. This change would crash the system every time clk_get() failed.


sa11xx_drv_pcmcia_ops(ops);

sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
- if (!sinfo)
+ if (!sinfo) {
+ clk_put(clk);
+ kfree(sinfo);
return -ENOMEM;

If the memory allocation failed, there is nothing to free. That kfree() call is not needed; however, the clk_put() is needed here.

NACK.

Larry


+ }

sinfo->nskt = nr;
sinfo->clk = clk;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/