Messages in this thread Patch in this message | | | Date | Sat, 11 Mar 2006 19:44:09 +0100 | From | Adrian Bunk <> | Subject | [2.6 patch] drivers/media/dvb/bt8xx/dst_ca.c: fix 2 memory leaks |
| |
On Sat, Mar 11, 2006 at 05:12:13PM +0100, Adrian Bunk wrote: > On Sat, Mar 11, 2006 at 07:53:34PM +0400, Manu Abraham wrote: > > > > Yeah, it is better indeed. Would you mind if i schedule this for a > > little while later, since i have a couple of other fixes/additions as well ? > > There's no need to hurry since the whole problem is only a small memory > leak in a very unlikely case.
But when you'll apply it, please used the improved version below (based on a suggestion by Ingo Oeser).
cu Adrian
<-- snip -->
The Coverity checker spotted that thre was a memory leak if the second or third kmalloc() failed.
Besides this, I've also consolidated the three error handlings into one and removed the unneeded casts.
Signed-off-by: Adrian Bunk <bunk@stusta.de>
---
drivers/media/dvb/bt8xx/dst_ca.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
--- linux-2.6.16-rc5-mm3-full/drivers/media/dvb/bt8xx/dst_ca.c.old 2006-03-11 14:36:59.000000000 +0100 +++ linux-2.6.16-rc5-mm3-full/drivers/media/dvb/bt8xx/dst_ca.c 2006-03-11 15:28:26.000000000 +0100 @@ -473,18 +473,17 @@ static int dst_ca_ioctl(struct inode *in void __user *arg = (void __user *)ioctl_arg; int result = 0; - if ((p_ca_message = (struct ca_msg *) kmalloc(sizeof (struct ca_msg), GFP_KERNEL)) == NULL) { - dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); - return -ENOMEM; - } - if ((p_ca_slot_info = (struct ca_slot_info *) kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL)) == NULL) { - dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); - return -ENOMEM; - } - if ((p_ca_caps = (struct ca_caps *) kmalloc(sizeof (struct ca_caps), GFP_KERNEL)) == NULL) { + p_ca_message = kmalloc(sizeof (struct ca_msg), GFP_KERNEL); + p_ca_slot_info = kmalloc(sizeof (struct ca_slot_info), GFP_KERNEL); + p_ca_caps = kmalloc(sizeof (struct ca_caps), GFP_KERNEL); + + + if (!p_ca_message || !p_ca_slot_info || !p_ca_caps) { dprintk(verbose, DST_CA_ERROR, 1, " Memory allocation failure"); - return -ENOMEM; + result = -ENOMEM; + goto free_mem_and_exit; } + /* We have now only the standard ioctl's, the driver is upposed to handle internals. */ switch (cmd) { case CA_SEND_MSG: - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |