soc: qcom: mdt_loader: Validate that p_filesz < p_memsz
authorBjorn Andersson <bjorn.andersson@linaro.org>
Thu, 7 Jan 2021 23:31:19 +0000 (15:31 -0800)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Thu, 8 Apr 2021 15:28:55 +0000 (10:28 -0500)
The code validates that segments of p_memsz bytes of a segment will fit
in the provided memory region, but does not validate that p_filesz bytes
will, which means that an incorrectly crafted ELF header might write
beyond the provided memory region.

Fixes: 051fb70fd4ea ("remoteproc: qcom: Driver for the self-authenticating Hexagon v5")
Reviewed-by: Sibi Sankar <sibis@codeaurora.org>
Link: https://lore.kernel.org/r/20210107233119.717173-1-bjorn.andersson@linaro.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/soc/qcom/mdt_loader.c

index 24cd193..2ddaee5 100644 (file)
@@ -230,6 +230,14 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,
                        break;
                }
 
+               if (phdr->p_filesz > phdr->p_memsz) {
+                       dev_err(dev,
+                               "refusing to load segment %d with p_filesz > p_memsz\n",
+                               i);
+                       ret = -EINVAL;
+                       break;
+               }
+
                ptr = mem_region + offset;
 
                if (phdr->p_filesz && phdr->p_offset < fw->size) {