OSDN Git Service

media: pci: cx23885: handle adding to list failure
authorNicholas Mc Guire <hofrat@osadl.org>
Sun, 9 Sep 2018 16:02:32 +0000 (12:02 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Nov 2018 08:27:38 +0000 (09:27 +0100)
[ Upstream commit c5d59528e24ad22500347b199d52b9368e686a42 ]

altera_hw_filt_init() which calls append_internal() assumes
that the node was successfully linked in while in fact it can
silently fail. So the call-site needs to set return to -ENOMEM
on append_internal() returning NULL and exit through the err path.

Fixes: 349bcf02e361 ("[media] Altera FPGA based CI driver module")

Signed-off-by: Nicholas Mc Guire <hofrat@osadl.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/pci/cx23885/altera-ci.c

index aaf4e46..a0c1ff9 100644 (file)
@@ -660,6 +660,10 @@ static int altera_hw_filt_init(struct altera_ci_config *config, int hw_filt_nr)
                }
 
                temp_int = append_internal(inter);
+               if (!temp_int) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
                inter->filts_used = 1;
                inter->dev = config->dev;
                inter->fpga_rw = config->fpga_rw;
@@ -694,6 +698,7 @@ err:
                     __func__, ret);
 
        kfree(pid_filt);
+       kfree(inter);
 
        return ret;
 }
@@ -728,6 +733,10 @@ int altera_ci_init(struct altera_ci_config *config, int ci_nr)
                }
 
                temp_int = append_internal(inter);
+               if (!temp_int) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
                inter->cis_used = 1;
                inter->dev = config->dev;
                inter->fpga_rw = config->fpga_rw;
@@ -796,6 +805,7 @@ err:
        ci_dbg_print("%s: Cannot initialize CI: Error %d.\n", __func__, ret);
 
        kfree(state);
+       kfree(inter);
 
        return ret;
 }