[PATCH] zr364xx: fix return values

Akinobu Mita <[email protected]>
Newsgroups gmane.linux.usb.devel,gmane.comp.video.video4linux
Message-ID <20070520110147.GA1572@APFDCB5C>
This patch fixes several return value related problems in zr364xx.

- return -ENOMEM instead of -ENODEV on out of memory

- zr364xx checks video_register_device() error only when
  its return value is -1. But video_register_device() doesn't
  always return -1 on error.

- If usb_register() returns error, module_init() wrongly returns 1:

	retval = usb_register(&zr364xx_driver) < 0;
	...

	return retval;

  And it allows the module to be loaded. Because sys_init_module() doesn't
  see positive return value as error.

Cc: Antoine Jacquet <[email protected]>
Signed-off-by: Akinobu Mita <[email protected]>

---
 drivers/media/video/zr364xx.c |   17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

Index: 2.6-mm/drivers/media/video/zr364xx.c
===================================================================
--- 2.6-mm.orig/drivers/media/video/zr364xx.c
+++ 2.6-mm/drivers/media/video/zr364xx.c
@@ -792,6 +792,7 @@ static int zr364xx_probe(struct usb_inte
 {
 	struct usb_device *udev = interface_to_usbdev(intf);
 	struct zr364xx_camera *cam = NULL;
+	int err;
 
 	DBG("probing...");
 
@@ -799,12 +800,11 @@ static int zr364xx_probe(struct usb_inte
 	info("model %04x:%04x detected", udev->descriptor.idVendor,
 	     udev->descriptor.idProduct);
 
-	if ((cam =
-	     kmalloc(sizeof(struct zr364xx_camera), GFP_KERNEL)) == NULL) {
+	cam = kzalloc(sizeof(struct zr364xx_camera), GFP_KERNEL);
+	if (cam == NULL) {
 		info("cam: out of memory !");
-		return -ENODEV;
+		return -ENOMEM;
 	}
-	memset(cam, 0x00, sizeof(struct zr364xx_camera));
 	/* save the init method used by this camera */
 	cam->method = id->driver_info;
 
@@ -812,7 +812,7 @@ static int zr364xx_probe(struct usb_inte
 	if (cam->vdev == NULL) {
 		info("cam->vdev: out of memory !");
 		kfree(cam);
-		return -ENODEV;
+		return -ENOMEM;
 	}
 	memcpy(cam->vdev, &zr364xx_template, sizeof(zr364xx_template));
 	video_set_drvdata(cam->vdev, cam);
@@ -858,12 +858,13 @@ static int zr364xx_probe(struct usb_inte
 	cam->brightness = 64;
 	mutex_init(&cam->lock);
 
-	if (video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1) == -1) {
+	err = video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1);
+	if (err) {
 		info("video_register_device failed");
 		video_device_release(cam->vdev);
 		kfree(cam->buffer);
 		kfree(cam);
-		return -ENODEV;
+		return err;
 	}
 
 	usb_set_intfdata(intf, cam);
@@ -905,7 +906,7 @@ static struct usb_driver zr364xx_driver 
 static int __init zr364xx_init(void)
 {
 	int retval;
-	retval = usb_register(&zr364xx_driver) < 0;
+	retval = usb_register(&zr364xx_driver);
 	if (retval)
 		info("usb_register failed!");
 	else

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[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.