lkml.org 
[lkml]   [2006]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    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/

    \
     
     \ /
      Last update: 2006-03-11 19:46    [W:0.026 / U:30.328 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site