media: cx88: Fix some error handling path in 'cx8800_initdev()'
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sun, 22 Sep 2019 07:41:23 +0000 (04:41 -0300)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 10 Oct 2019 10:20:01 +0000 (07:20 -0300)
A call to 'pci_disable_device()' is missing in the error handling path.
In some cases, a call to 'free_irq()' may also be missing.

Reorder the error handling path, add some new labels and fix the 2 issues
mentionned above.

This way, the error handling path in more in line with 'cx8800_finidev()'
(i.e. the remove function)

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/pci/cx88/cx88-video.c

index dcc0f02aeb70ca05b9b15031f86641896176285b..b8abcd55060473aa3a4b5348be6e15365767d473 100644 (file)
@@ -1277,7 +1277,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
        core = cx88_core_get(dev->pci);
        if (!core) {
                err = -EINVAL;
        core = cx88_core_get(dev->pci);
        if (!core) {
                err = -EINVAL;
-               goto fail_free;
+               goto fail_disable;
        }
        dev->core = core;
 
        }
        dev->core = core;
 
@@ -1323,7 +1323,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
                                       cc->step, cc->default_value);
                if (!vc) {
                        err = core->audio_hdl.error;
                                       cc->step, cc->default_value);
                if (!vc) {
                        err = core->audio_hdl.error;
-                       goto fail_core;
+                       goto fail_irq;
                }
                vc->priv = (void *)cc;
        }
                }
                vc->priv = (void *)cc;
        }
@@ -1337,7 +1337,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
                                       cc->step, cc->default_value);
                if (!vc) {
                        err = core->video_hdl.error;
                                       cc->step, cc->default_value);
                if (!vc) {
                        err = core->video_hdl.error;
-                       goto fail_core;
+                       goto fail_irq;
                }
                vc->priv = (void *)cc;
                if (vc->id == V4L2_CID_CHROMA_AGC)
                }
                vc->priv = (void *)cc;
                if (vc->id == V4L2_CID_CHROMA_AGC)
@@ -1509,11 +1509,14 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
 
 fail_unreg:
        cx8800_unregister_video(dev);
 
 fail_unreg:
        cx8800_unregister_video(dev);
-       free_irq(pci_dev->irq, dev);
        mutex_unlock(&core->lock);
        mutex_unlock(&core->lock);
+fail_irq:
+       free_irq(pci_dev->irq, dev);
 fail_core:
        core->v4ldev = NULL;
        cx88_core_put(core, dev->pci);
 fail_core:
        core->v4ldev = NULL;
        cx88_core_put(core, dev->pci);
+fail_disable:
+       pci_disable_device(pci_dev);
 fail_free:
        kfree(dev);
        return err;
 fail_free:
        kfree(dev);
        return err;