lkml.org 
[lkml]   [2021]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.12 178/384] media: media/saa7164: fix saa7164_encoder_register() memory leak bugs
    Date
    From: Daniel Niv <danielniv3@gmail.com>

    [ Upstream commit c759b2970c561e3b56aa030deb13db104262adfe ]

    Add a fix for the memory leak bugs that can occur when the
    saa7164_encoder_register() function fails.
    The function allocates memory without explicitly freeing
    it when errors occur.
    Add a better error handling that deallocate the unused buffers before the
    function exits during a fail.

    Signed-off-by: Daniel Niv <danielniv3@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/pci/saa7164/saa7164-encoder.c | 20 +++++++++++---------
    1 file changed, 11 insertions(+), 9 deletions(-)

    diff --git a/drivers/media/pci/saa7164/saa7164-encoder.c b/drivers/media/pci/saa7164/saa7164-encoder.c
    index 11e1eb6a6809..1d1d32e043f1 100644
    --- a/drivers/media/pci/saa7164/saa7164-encoder.c
    +++ b/drivers/media/pci/saa7164/saa7164-encoder.c
    @@ -1008,7 +1008,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
    printk(KERN_ERR "%s() failed (errno = %d), NO PCI configuration\n",
    __func__, result);
    result = -ENOMEM;
    - goto failed;
    + goto fail_pci;
    }

    /* Establish encoder defaults here */
    @@ -1062,7 +1062,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
    100000, ENCODER_DEF_BITRATE);
    if (hdl->error) {
    result = hdl->error;
    - goto failed;
    + goto fail_hdl;
    }

    port->std = V4L2_STD_NTSC_M;
    @@ -1080,7 +1080,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
    printk(KERN_INFO "%s: can't allocate mpeg device\n",
    dev->name);
    result = -ENOMEM;
    - goto failed;
    + goto fail_hdl;
    }

    port->v4l_device->ctrl_handler = hdl;
    @@ -1091,10 +1091,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
    if (result < 0) {
    printk(KERN_INFO "%s: can't register mpeg device\n",
    dev->name);
    - /* TODO: We're going to leak here if we don't dealloc
    - The buffers above. The unreg function can't deal wit it.
    - */
    - goto failed;
    + goto fail_reg;
    }

    printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
    @@ -1116,9 +1113,14 @@ int saa7164_encoder_register(struct saa7164_port *port)

    saa7164_api_set_encoder(port);
    saa7164_api_get_encoder(port);
    + return 0;

    - result = 0;
    -failed:
    +fail_reg:
    + video_device_release(port->v4l_device);
    + port->v4l_device = NULL;
    +fail_hdl:
    + v4l2_ctrl_handler_free(hdl);
    +fail_pci:
    return result;
    }

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-05-10 15:01    [W:2.701 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site