drivers/media/video/stv680.c: check kmalloc() return value.
PATCH 1/1 drivers/media/video/stv680.c: check kmalloc() return value.
Description: Check the return value of kmalloc() in function stv680_start_stream(), in file drivers/media/video/stv680.c.
Signed-off-by Amit Choudhary <[email protected]>
drivers/media/video/stv680.c +30 -4
@@ -687,7 +687,11 @@ static int stv680_start_stream (struct u stv680->sbuf[i].data =kmalloc (stv680->rawbufsize,GFP_KERNEL );if (stv680->sbuf[i].data ==NULL ) {PDEBUG (0 ,"STV(e): Could not kmalloc raw data buffer %i" , i); -return -1 ; +for (i = i -1 ; i >=0 ; i--) { +kfree (stv680->sbuf[i].data); + stv680->sbuf[i].data =NULL ; + } +return -ENOMEM ; } }
@@ -698,15 +702,25 @@ static int stv680_start_stream (struct u stv680->scratch[i].data =kmalloc (stv680->rawbufsize,GFP_KERNEL );if (stv680->scratch[i].data ==NULL ) {PDEBUG (0 ,"STV(e): Could not kmalloc raw scratch buffer %i" , i); -return -1 ; +for (i = i -1 ; i >=0 ; i--) { +kfree (stv680->scratch[i].data); + stv680->scratch[i].data =NULL ; + } + goto nomem_sbuf; } stv680->scratch[i].state =BUFFER_UNUSED ; }for (i =0 ; i <STV680_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 (stv680->urb[i]); +usb_free_urb (stv680->urb[i]); + stv680->urb[i] =NULL ; + } + goto nomem_scratch; + }/* sbuf is urb->transfer_buffer, later gets memcpyed to scratch */ usb_fill_bulk_urb (urb, stv680->udev,
@@ -721,6 +735,18 @@ static int stv680_start_stream (struct u stv680->framecount =0 ;return 0 ; + + nomem_scratch: +for (i=0 ; i<STV680_NUMSCRATCH ; i++) { +kfree (stv680->scratch[i].data); + stv680->scratch[i].data =NULL ; + } + nomem_sbuf: +for (i=0 ; i<STV680_NUMSBUF ; i++) { +kfree (stv680->sbuf[i].data); + stv680->sbuf[i].data =NULL ; + } +return -ENOMEM ; }static int stv680_stop_stream (struct usb_stv *stv680)