diff --git a/asoc/codecs/wcd-dsp-utils.c b/asoc/codecs/wcd-dsp-utils.c index 4eafd55894..1c95d48a1a 100644 --- a/asoc/codecs/wcd-dsp-utils.c +++ b/asoc/codecs/wcd-dsp-utils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -82,6 +82,15 @@ static int wdsp_add_segment_to_list(struct device *dev, goto bad_seg; } + if (phdr->p_filesz != seg->split_fw->size) { + dev_err(dev, + "%s: %s size mismatch, phdr_size: 0x%x fw_size: 0x%zx", + __func__, seg->split_fname, phdr->p_filesz, + seg->split_fw->size); + ret = -EINVAL; + goto bad_elf; + } + seg->load_addr = phdr->p_paddr; seg->size = phdr->p_filesz; seg->data = (u8 *) seg->split_fw->data; @@ -89,6 +98,8 @@ static int wdsp_add_segment_to_list(struct device *dev, list_add_tail(&seg->list, seg_list); done: return ret; +bad_elf: + release_firmware(seg->split_fw); bad_seg: kfree(seg); return ret;