diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c index 38249a1a27d0..a441763fbd29 100644 --- a/drivers/soc/qcom/mdt_loader.c +++ b/drivers/soc/qcom/mdt_loader.c @@ -92,10 +92,16 @@ void *qcom_mdt_read_metadata(const struct firmware *fw, size_t *data_len) size_t ehdr_size; void *data; + if (fw->size < sizeof(struct elf32_hdr)) { + dev_err(dev, "Image is too small\n"); + return ERR_PTR(-EINVAL); + } + ehdr = (struct elf32_hdr *)fw->data; phdrs = (struct elf32_phdr *)(ehdr + 1); - if (ehdr->e_phnum < 2 || ehdr->e_phnum > PN_XNUM) + if (ehdr->e_phnum < 2 || ehdr->e_phoff > fw->size || + (sizeof(phdrs) * ehdr->e_phnum > fw->size - ehdr->e_phoff)) return ERR_PTR(-EINVAL); if (phdrs[0].p_type == PT_LOAD)