From: Markus Elfring <[email protected]>
Date: Tue, 3 Feb 2015 16:47:48 +0100

The functions "dvb_unregister_device" and "kfree" could still be called
by the dvb_ca_en50221_init() function in the case that a previous resource
allocation failed.

* Corresponding details could be improved by adjustments for jump targets.

* Let us delete also an unnecessary check for the variable "ca" there.

Signed-off-by: Markus Elfring <[email protected]>
---
 drivers/media/dvb-core/dvb_ca_en50221.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/media/dvb-core/dvb_ca_en50221.c 
b/drivers/media/dvb-core/dvb_ca_en50221.c
index b999689..9842fd1 100644
--- a/drivers/media/dvb-core/dvb_ca_en50221.c
+++ b/drivers/media/dvb-core/dvb_ca_en50221.c
@@ -1676,14 +1676,14 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
        /* initialise the system data */
        if ((ca = kzalloc(sizeof(struct dvb_ca_private), GFP_KERNEL)) == NULL) {
                ret = -ENOMEM;
-               goto error;
+               goto exit;
        }
        ca->pub = pubca;
        ca->flags = flags;
        ca->slot_count = slot_count;
        if ((ca->slot_info = kcalloc(slot_count, sizeof(struct dvb_ca_slot), 
GFP_KERNEL)) == NULL) {
                ret = -ENOMEM;
-               goto error;
+               goto free_ca;
        }
        init_waitqueue_head(&ca->wait_queue);
        ca->open = 0;
@@ -1694,7 +1694,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
        /* register the DVB device */
        ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca, 
DVB_DEVICE_CA);
        if (ret)
-               goto error;
+               goto free_slot_info;
 
        /* now initialise each slot */
        for (i = 0; i < slot_count; i++) {
@@ -1709,7 +1709,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
 
        if (signal_pending(current)) {
                ret = -EINTR;
-               goto error;
+               goto unregister_device;
        }
        mb();
 
@@ -1720,16 +1720,17 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
                ret = PTR_ERR(ca->thread);
                printk("dvb_ca_init: failed to start kernel_thread (%d)\n",
                        ret);
-               goto error;
+               goto unregister_device;
        }
        return 0;
 
-error:
-       if (ca != NULL) {
-               dvb_unregister_device(ca->dvbdev);
-               kfree(ca->slot_info);
-               kfree(ca);
-       }
+unregister_device:
+       dvb_unregister_device(ca->dvbdev);
+free_slot_info:
+       kfree(ca->slot_info);
+free_ca:
+       kfree(ca);
+exit:
        pubca->private = NULL;
        return ret;
 }
-- 
2.2.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to