]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: ccs: Clean up parsed CCS static data on parse failure
authorSakari Ailus <sakari.ailus@linux.intel.com>
Tue, 3 Dec 2024 10:23:01 +0000 (12:23 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 19 Dec 2024 11:50:13 +0000 (12:50 +0100)
ccs_data_parse() releases the allocated in-memory data structure when the
parser fails, but it does not clean up parsed metadata that is there to
help access the actual data. Do that, in order to return the data
structure in a sane state.

Fixes: a6b396f410b1 ("media: ccs: Add CCS static data parser library")
Cc: stable@vger.kernel.org
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Mehdi Djait <mehdi.djait@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/ccs/ccs-data.c

index 9d42137f4799519eb72d9f819d178f511456a82b..2591dba51e17e28b7fffbd9162570887b6f61e6a 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/limits.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
+#include <linux/string.h>
 
 #include "ccs-data-defs.h"
 
@@ -948,15 +949,15 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
 
        rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, verbose);
        if (rval)
-               return rval;
+               goto out_cleanup;
 
        rval = bin_backing_alloc(&bin);
        if (rval)
-               return rval;
+               goto out_cleanup;
 
        rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, false);
        if (rval)
-               goto out_free;
+               goto out_cleanup;
 
        if (verbose && ccsdata->version)
                print_ccs_data_version(dev, ccsdata->version);
@@ -965,15 +966,16 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
                rval = -EPROTO;
                dev_dbg(dev, "parsing mismatch; base %p; now %p; end %p\n",
                        bin.base, bin.now, bin.end);
-               goto out_free;
+               goto out_cleanup;
        }
 
        ccsdata->backing = bin.base;
 
        return 0;
 
-out_free:
+out_cleanup:
        kvfree(bin.base);
+       memset(ccsdata, 0, sizeof(*ccsdata));
 
        return rval;
 }