lkml.org 
[lkml]   [2018]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 14/88] media: hdpvr: Fix an error handling path in hdpvr_probe()
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Arvind Yadav <arvind.yadav.cs@gmail.com>

    commit c0f71bbb810237a38734607ca4599632f7f5d47f upstream.

    Here, hdpvr_register_videodev() is responsible for setup and
    register a video device. Also defining and initializing a worker.
    hdpvr_register_videodev() is calling by hdpvr_probe at last.
    So no need to flush any work here.
    Unregister v4l2, free buffers and memory. If hdpvr_probe() will fail.

    Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com>
    Reported-by: Andrey Konovalov <andreyknvl@google.com>
    Tested-by: Andrey Konovalov <andreyknvl@google.com>
    Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/media/usb/hdpvr/hdpvr-core.c | 26 +++++++++++++++-----------
    1 file changed, 15 insertions(+), 11 deletions(-)

    --- a/drivers/media/usb/hdpvr/hdpvr-core.c
    +++ b/drivers/media/usb/hdpvr/hdpvr-core.c
    @@ -295,7 +295,7 @@ static int hdpvr_probe(struct usb_interf
    /* register v4l2_device early so it can be used for printks */
    if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) {
    dev_err(&interface->dev, "v4l2_device_register failed\n");
    - goto error;
    + goto error_free_dev;
    }

    mutex_init(&dev->io_mutex);
    @@ -304,7 +304,7 @@ static int hdpvr_probe(struct usb_interf
    dev->usbc_buf = kmalloc(64, GFP_KERNEL);
    if (!dev->usbc_buf) {
    v4l2_err(&dev->v4l2_dev, "Out of memory\n");
    - goto error;
    + goto error_v4l2_unregister;
    }

    init_waitqueue_head(&dev->wait_buffer);
    @@ -342,13 +342,13 @@ static int hdpvr_probe(struct usb_interf
    }
    if (!dev->bulk_in_endpointAddr) {
    v4l2_err(&dev->v4l2_dev, "Could not find bulk-in endpoint\n");
    - goto error;
    + goto error_put_usb;
    }

    /* init the device */
    if (hdpvr_device_init(dev)) {
    v4l2_err(&dev->v4l2_dev, "device init failed\n");
    - goto error;
    + goto error_put_usb;
    }

    mutex_lock(&dev->io_mutex);
    @@ -356,7 +356,7 @@ static int hdpvr_probe(struct usb_interf
    mutex_unlock(&dev->io_mutex);
    v4l2_err(&dev->v4l2_dev,
    "allocating transfer buffers failed\n");
    - goto error;
    + goto error_put_usb;
    }
    mutex_unlock(&dev->io_mutex);

    @@ -364,7 +364,7 @@ static int hdpvr_probe(struct usb_interf
    retval = hdpvr_register_i2c_adapter(dev);
    if (retval < 0) {
    v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n");
    - goto error;
    + goto error_free_buffers;
    }

    client = hdpvr_register_ir_rx_i2c(dev);
    @@ -397,13 +397,17 @@ static int hdpvr_probe(struct usb_interf
    reg_fail:
    #if IS_ENABLED(CONFIG_I2C)
    i2c_del_adapter(&dev->i2c_adapter);
    +error_free_buffers:
    #endif
    + hdpvr_free_buffers(dev);
    +error_put_usb:
    + usb_put_dev(dev->udev);
    + kfree(dev->usbc_buf);
    +error_v4l2_unregister:
    + v4l2_device_unregister(&dev->v4l2_dev);
    +error_free_dev:
    + kfree(dev);
    error:
    - if (dev) {
    - flush_work(&dev->worker);
    - /* this frees allocated memory */
    - hdpvr_delete(dev);
    - }
    return retval;
    }


    \
     
     \ /
      Last update: 2018-02-15 19:26    [W:2.084 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site