mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
media: ccs: Clean up parsed CCS static data on parse failure
commit da73efa8e675a2b58f1c7ae61201acfe57714bf7 upstream.
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: a6b396f410 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
621b80eb88
commit
07bca7b592
@@ -10,6 +10,7 @@
|
|||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
#include "ccs-data-defs.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);
|
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, verbose);
|
||||||
if (rval)
|
if (rval)
|
||||||
return rval;
|
goto out_cleanup;
|
||||||
|
|
||||||
rval = bin_backing_alloc(&bin);
|
rval = bin_backing_alloc(&bin);
|
||||||
if (rval)
|
if (rval)
|
||||||
return rval;
|
goto out_cleanup;
|
||||||
|
|
||||||
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, false);
|
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, false);
|
||||||
if (rval)
|
if (rval)
|
||||||
goto out_free;
|
goto out_cleanup;
|
||||||
|
|
||||||
if (verbose && ccsdata->version)
|
if (verbose && ccsdata->version)
|
||||||
print_ccs_data_version(dev, 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;
|
rval = -EPROTO;
|
||||||
dev_dbg(dev, "parsing mismatch; base %p; now %p; end %p\n",
|
dev_dbg(dev, "parsing mismatch; base %p; now %p; end %p\n",
|
||||||
bin.base, bin.now, bin.end);
|
bin.base, bin.now, bin.end);
|
||||||
goto out_free;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
ccsdata->backing = bin.base;
|
ccsdata->backing = bin.base;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free:
|
out_cleanup:
|
||||||
kvfree(bin.base);
|
kvfree(bin.base);
|
||||||
|
memset(ccsdata, 0, sizeof(*ccsdata));
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user