]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
[media] usb: check media device errors
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 28 Dec 2015 11:55:49 +0000 (09:55 -0200)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 11 Jan 2016 14:19:15 +0000 (12:19 -0200)
There are now two new warnings:

drivers/media/usb/dvb-usb-v2/dvb_usb_core.c: In function 'dvb_usbv2_media_device_register':
drivers/media/usb/dvb-usb-v2/dvb_usb_core.c:433:2: warning: ignoring return value of '__media_device_register', declared with attribute warn_unused_result [-Wunused-result]
  media_device_register(adap->dvb_adap.mdev);
  ^
drivers/media/usb/dvb-usb/dvb-usb-dvb.c: In function 'dvb_usb_media_device_register':
drivers/media/usb/dvb-usb/dvb-usb-dvb.c:128:2: warning: ignoring return value of '__media_device_register', declared with attribute warn_unused_result [-Wunused-result]
  media_device_register(adap->dvb_adap.mdev);
  ^

Those are because the drivers are not properly checking if the
media device init and register were succeeded.

Fix it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/usb/au0828/au0828-core.c
drivers/media/usb/cx231xx/cx231xx-cards.c
drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
drivers/media/usb/dvb-usb/dvb-usb-dvb.c

index fbdaeb206565b2723a999ad96fe10f85b6d20f3c..9e29e70a78d7b20f8b250cbde914c2a589a82052 100644 (file)
@@ -217,15 +217,15 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
        au0828_usb_release(dev);
 }
 
-static void au0828_media_device_init(struct au0828_dev *dev,
-                                    struct usb_device *udev)
+static int au0828_media_device_init(struct au0828_dev *dev,
+                                   struct usb_device *udev)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER
        struct media_device *mdev;
 
        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
        if (!mdev)
-               return;
+               return -ENOMEM;
 
        mdev->dev = &udev->dev;
 
@@ -243,6 +243,7 @@ static void au0828_media_device_init(struct au0828_dev *dev,
 
        dev->media_dev = mdev;
 #endif
+       return 0;
 }
 
 
@@ -368,7 +369,14 @@ static int au0828_usb_probe(struct usb_interface *interface,
        dev->board = au0828_boards[dev->boardnr];
 
        /* Initialize the media controller */
-       au0828_media_device_init(dev, usbdev);
+       retval = au0828_media_device_init(dev, usbdev);
+       if (retval) {
+               pr_err("%s() au0828_media_device_init failed\n",
+                      __func__);
+               mutex_unlock(&dev->lock);
+               kfree(dev);
+               return retval;
+       }
 
 #ifdef CONFIG_VIDEO_AU0828_V4L2
        dev->v4l2_dev.release = au0828_usb_v4l2_release;
index de0026b5265cffba8a4e88b894c63bcefd3f522a..620b83d03f75a1c6952f4982d2a85c53fe0e54aa 100644 (file)
@@ -1206,7 +1206,7 @@ void cx231xx_release_resources(struct cx231xx *dev)
        clear_bit(dev->devno, &cx231xx_devused);
 }
 
-static void cx231xx_media_device_init(struct cx231xx *dev,
+static int cx231xx_media_device_init(struct cx231xx *dev,
                                      struct usb_device *udev)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER
@@ -1214,7 +1214,7 @@ static void cx231xx_media_device_init(struct cx231xx *dev,
 
        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
        if (!mdev)
-               return;
+               return -ENOMEM;
 
        mdev->dev = dev->dev;
        strlcpy(mdev->model, dev->board.name, sizeof(mdev->model));
@@ -1228,6 +1228,7 @@ static void cx231xx_media_device_init(struct cx231xx *dev,
 
        dev->media_dev = mdev;
 #endif
+       return 0;
 }
 
 static int cx231xx_create_media_graph(struct cx231xx *dev)
@@ -1663,7 +1664,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
        usb_set_intfdata(interface, dev);
 
        /* Initialize the media controller */
-       cx231xx_media_device_init(dev, udev);
+       retval = cx231xx_media_device_init(dev, udev);
+       if (retval) {
+               dev_err(d, "cx231xx_media_device_init failed\n");
+               goto err_media_init;
+       }
 
        /* Create v4l2 device */
 #ifdef CONFIG_MEDIA_CONTROLLER
@@ -1758,6 +1763,8 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
 err_init:
        v4l2_device_unregister(&dev->v4l2_dev);
 err_v4l2:
+       cx231xx_unregister_media_device(dev);
+err_media_init:
        usb_set_intfdata(interface, NULL);
 err_if:
        usb_put_dev(udev);
index 7f52bcbd8b0d640f3d3cad98ccd677d97bd9b640..0fa2c45917b029f86270c4e4d3767642796c9103 100644 (file)
@@ -400,7 +400,7 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
        return ret;
 }
 
-static void dvb_usbv2_media_device_init(struct dvb_usb_adapter *adap)
+static int dvb_usbv2_media_device_init(struct dvb_usb_adapter *adap)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
        struct media_device *mdev;
@@ -409,7 +409,7 @@ static void dvb_usbv2_media_device_init(struct dvb_usb_adapter *adap)
 
        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
        if (!mdev)
-               return;
+               return -ENOMEM;
 
        mdev->dev = &udev->dev;
        strlcpy(mdev->model, d->name, sizeof(mdev->model));
@@ -425,12 +425,15 @@ static void dvb_usbv2_media_device_init(struct dvb_usb_adapter *adap)
 
        dev_info(&d->udev->dev, "media controller created\n");
 #endif
+       return 0;
 }
 
-static void dvb_usbv2_media_device_register(struct dvb_usb_adapter *adap)
+static int dvb_usbv2_media_device_register(struct dvb_usb_adapter *adap)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
-       media_device_register(adap->dvb_adap.mdev);
+       return media_device_register(adap->dvb_adap.mdev);
+#else
+       return 0;
 #endif
 }
 
@@ -466,7 +469,12 @@ static int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
 
        adap->dvb_adap.priv = adap;
 
-       dvb_usbv2_media_device_init(adap);
+       ret = dvb_usbv2_media_device_init(adap);
+       if (ret < 0) {
+               dev_dbg(&d->udev->dev, "%s: dvb_usbv2_media_device_init() failed=%d\n",
+                               __func__, ret);
+               goto err_dvb_register_mc;
+       }
 
        if (d->props->read_mac_address) {
                ret = d->props->read_mac_address(adap,
@@ -517,6 +525,7 @@ static int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
        dvb_dmx_release(&adap->demux);
 err_dvb_dmx_init:
        dvb_usbv2_media_device_unregister(adap);
+err_dvb_register_mc:
        dvb_unregister_adapter(&adap->dvb_adap);
 err_dvb_register_adapter:
        adap->dvb_adap.priv = NULL;
@@ -701,9 +710,9 @@ static int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap)
        if (ret < 0)
                goto err_dvb_unregister_frontend;
 
-       dvb_usbv2_media_device_register(adap);
+       ret = dvb_usbv2_media_device_register(adap);
 
-       return 0;
+       return ret;
 
 err_dvb_unregister_frontend:
        for (i = count_registered - 1; i >= 0; i--)
index 6a4bb2d86175046a85662297a8a5488e0d14d808..241463ef631e003b290b4e5e6b469428e9450b9e 100644 (file)
@@ -95,7 +95,7 @@ static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
        return dvb_usb_ctrl_feed(dvbdmxfeed, 0);
 }
 
-static void dvb_usb_media_device_init(struct dvb_usb_adapter *adap)
+static int dvb_usb_media_device_init(struct dvb_usb_adapter *adap)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
        struct media_device *mdev;
@@ -104,7 +104,7 @@ static void dvb_usb_media_device_init(struct dvb_usb_adapter *adap)
 
        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
        if (!mdev)
-               return;
+               return -ENOMEM;
 
        mdev->dev = &udev->dev;
        strlcpy(mdev->model, d->desc->name, sizeof(mdev->model));
@@ -120,12 +120,15 @@ static void dvb_usb_media_device_init(struct dvb_usb_adapter *adap)
 
        dev_info(&d->udev->dev, "media controller created\n");
 #endif
+       return 0;
 }
 
-static void dvb_usb_media_device_register(struct dvb_usb_adapter *adap)
+static int  dvb_usb_media_device_register(struct dvb_usb_adapter *adap)
 {
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
-       media_device_register(adap->dvb_adap.mdev);
+       return media_device_register(adap->dvb_adap.mdev);
+#else
+       return 0;
 #endif
 }
 
@@ -155,7 +158,11 @@ int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
        }
        adap->dvb_adap.priv = adap;
 
-       dvb_usb_media_device_init(adap);
+       ret = dvb_usb_media_device_init(adap);
+       if (ret < 0) {
+               deb_info("dvb_usb_media_device_init failed: error %d", ret);
+               goto err_mc;
+       }
 
        if (adap->dev->props.read_mac_address) {
                if (adap->dev->props.read_mac_address(adap->dev, adap->dvb_adap.proposed_mac) == 0)
@@ -205,6 +212,7 @@ int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
        dvb_dmx_release(&adap->demux);
 err_dmx:
        dvb_usb_media_device_unregister(adap);
+err_mc:
        dvb_unregister_adapter(&adap->dvb_adap);
 err:
        return ret;
@@ -323,8 +331,10 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
                return ret;
 
        ret = dvb_create_media_graph(&adap->dvb_adap);
+       if (ret)
+               return ret;
 
-       dvb_usb_media_device_register(adap);
+       ret = dvb_usb_media_device_register(adap);
 
        return ret;
 }