]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: media/saa7164: fix saa7164_encoder_register() memory leak bugs
authorDaniel Niv <danielniv3@gmail.com>
Thu, 11 Mar 2021 02:53:00 +0000 (03:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 May 2021 08:38:18 +0000 (10:38 +0200)
[ 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

index 1b184c39ba97ddf730982dc76c3788a1754456e6..966de363c57582abf49aa52126250b24c5042592 100644 (file)
@@ -1031,7 +1031,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
                       "(errno = %d), NO PCI configuration\n",
                        __func__, result);
                result = -ENOMEM;
-               goto failed;
+               goto fail_pci;
        }
 
        /* Establish encoder defaults here */
@@ -1085,7 +1085,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;
@@ -1103,7 +1103,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;
@@ -1114,10 +1114,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",
@@ -1139,9 +1136,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;
 }