lkml.org 
[lkml]   [2006]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2.6.19-rc2] [REVISED 2] drivers/media/video/se401.c: check kmalloc() return value.
    Description: Check the return value of kmalloc() in function se401_start_stream(), in file drivers/media/video/se401.c.

    Signed-off-by: Amit Choudhary <amit2030@gmail.com>

    diff --git a/drivers/media/video/se401.c b/drivers/media/video/se401.c
    index 7aeec57..006c818 100644
    --- a/drivers/media/video/se401.c
    +++ b/drivers/media/video/se401.c
    @@ -450,6 +450,13 @@ static int se401_start_stream(struct usb
    }
    for (i=0; i<SE401_NUMSBUF; i++) {
    se401->sbuf[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
    + if (!se401->sbuf[i].data) {
    + for(i = i - 1; i >= 0; i--) {
    + kfree(se401->sbuf[i].data);
    + se401->sbuf[i].data = NULL;
    + }
    + return -ENOMEM;
    + }
    }

    se401->bayeroffset=0;
    @@ -458,13 +465,26 @@ static int se401_start_stream(struct usb
    se401->scratch_overflow=0;
    for (i=0; i<SE401_NUMSCRATCH; i++) {
    se401->scratch[i].data=kmalloc(SE401_PACKETSIZE, GFP_KERNEL);
    + if (!se401->scratch[i].data) {
    + for(i = i - 1; i >= 0; i--) {
    + kfree(se401->scratch[i].data);
    + se401->scratch[i].data = NULL;
    + }
    + goto nomem_sbuf;
    + }
    se401->scratch[i].state=BUFFER_UNUSED;
    }

    for (i=0; i<SE401_NUMSBUF; i++) {
    urb=usb_alloc_urb(0, GFP_KERNEL);
    - if(!urb)
    - return -ENOMEM;
    + if(!urb) {
    + for(i = i - 1; i >= 0; i--) {
    + usb_kill_urb(se401->urb[i]);
    + usb_free_urb(se401->urb[i]);
    + se401->urb[i] = NULL;
    + }
    + goto nomem_scratch;
    + }

    usb_fill_bulk_urb(urb, se401->dev,
    usb_rcvbulkpipe(se401->dev, SE401_VIDEO_ENDPOINT),
    @@ -482,6 +502,18 @@ static int se401_start_stream(struct usb
    se401->framecount=0;

    return 0;
    +
    + nomem_scratch:
    + for (i=0; i<SE401_NUMSCRATCH; i++) {
    + kfree(se401->scratch[i].data);
    + se401->scratch[i].data = NULL;
    + }
    + nomem_sbuf:
    + for (i=0; i<SE401_NUMSBUF; i++) {
    + kfree(se401->sbuf[i].data);
    + se401->sbuf[i].data = NULL;
    + }
    + return -ENOMEM;
    }

    static int se401_stop_stream(struct usb_se401 *se401)
    -
    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-10-20 07:19    [W:0.029 / U:29.504 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site