[PATCH] [REVISED] drivers/media/video/stv680.c: check kmalloc() return value.

Amit Choudhary <[email protected]>
Newsgroups gmane.linux.usb.devel,gmane.linux.kernel,gmane.comp.video.video4linux
Organization X
Message-ID <[email protected]>
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]>

diff --git a/drivers/media/video/stv680.c b/drivers/media/video/stv680.c
index 6d1ef1e..f35c664 100644
--- a/drivers/media/video/stv680.c
+++ b/drivers/media/video/stv680.c
@@ -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)

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.