lkml.org 
[lkml]   [2019]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 091/413] media: davinci: vpif_capture: fix memory leak in vpif_probe()
    Date
    [ Upstream commit 64f883cd98c6d43013fb0cea788b63e50ebc068c ]

    If vpif_probe() fails on v4l2_device_register() and vpif_probe_complete(),
    then memory allocated at initialize_vpif() for global vpif_obj.dev[i]
    become unreleased.

    The patch adds deallocation of vpif_obj.dev[i] on the error path.

    Signed-off-by: Young Xiao <92siuyang@gmail.com>
    Acked-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/platform/davinci/vpif_capture.c | 16 ++++++++++++++--
    1 file changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c
    index 61809d2050fa..f0f7ef638c56 100644
    --- a/drivers/media/platform/davinci/vpif_capture.c
    +++ b/drivers/media/platform/davinci/vpif_capture.c
    @@ -1376,6 +1376,14 @@ static int initialize_vpif(void)
    return err;
    }

    +static inline void free_vpif_objs(void)
    +{
    + int i;
    +
    + for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++)
    + kfree(vpif_obj.dev[i]);
    +}
    +
    static int vpif_async_bound(struct v4l2_async_notifier *notifier,
    struct v4l2_subdev *subdev,
    struct v4l2_async_subdev *asd)
    @@ -1645,7 +1653,7 @@ static __init int vpif_probe(struct platform_device *pdev)
    err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev);
    if (err) {
    v4l2_err(vpif_dev->driver, "Error registering v4l2 device\n");
    - goto cleanup;
    + goto vpif_free;
    }

    while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) {
    @@ -1692,7 +1700,9 @@ static __init int vpif_probe(struct platform_device *pdev)
    "registered sub device %s\n",
    subdevdata->name);
    }
    - vpif_probe_complete();
    + err = vpif_probe_complete();
    + if (err)
    + goto probe_subdev_out;
    } else {
    vpif_obj.notifier.ops = &vpif_async_ops;
    err = v4l2_async_notifier_register(&vpif_obj.v4l2_dev,
    @@ -1711,6 +1721,8 @@ static __init int vpif_probe(struct platform_device *pdev)
    kfree(vpif_obj.sd);
    vpif_unregister:
    v4l2_device_unregister(&vpif_obj.v4l2_dev);
    +vpif_free:
    + free_vpif_objs();
    cleanup:
    v4l2_async_notifier_cleanup(&vpif_obj.notifier);

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-07-25 09:03    [W:5.425 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site