| From c9d567548c4c9b2261dd62b7d881187eb22b79c7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Jun 2025 21:58:30 -0500 |
| Subject: soc: qcom: mdt_loader: Actually use the e_phoff |
| |
| From: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com> |
| |
| [ Upstream commit 47e339cac89143709e84a3b71ba8bd9b2fdd2368 ] |
| |
| Rather than relying/assuming that the tools generating the firmware |
| places the program headers immediately following the ELF header, use |
| e_phoff as intended to find the program headers. |
| |
| Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> |
| Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com> |
| Link: https://lore.kernel.org/r/20250610-mdt-loader-validation-and-fixes-v2-3-f7073e9ab899@oss.qualcomm.com |
| Signed-off-by: Bjorn Andersson <andersson@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/qcom/mdt_loader.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c |
| index 6f177e46fa0f..8de1d478bec2 100644 |
| --- a/drivers/soc/qcom/mdt_loader.c |
| +++ b/drivers/soc/qcom/mdt_loader.c |
| @@ -85,7 +85,7 @@ ssize_t qcom_mdt_get_size(const struct firmware *fw) |
| int i; |
| |
| ehdr = (struct elf32_hdr *)fw->data; |
| - phdrs = (struct elf32_phdr *)(ehdr + 1); |
| + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff); |
| |
| for (i = 0; i < ehdr->e_phnum; i++) { |
| phdr = &phdrs[i]; |
| @@ -137,7 +137,7 @@ void *qcom_mdt_read_metadata(const struct firmware *fw, size_t *data_len, |
| void *data; |
| |
| ehdr = (struct elf32_hdr *)fw->data; |
| - phdrs = (struct elf32_phdr *)(ehdr + 1); |
| + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff); |
| |
| if (ehdr->e_phnum < 2) |
| return ERR_PTR(-EINVAL); |
| @@ -217,7 +217,7 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw, |
| int i; |
| |
| ehdr = (struct elf32_hdr *)fw->data; |
| - phdrs = (struct elf32_phdr *)(ehdr + 1); |
| + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff); |
| |
| for (i = 0; i < ehdr->e_phnum; i++) { |
| phdr = &phdrs[i]; |
| @@ -272,7 +272,7 @@ static bool qcom_mdt_bins_are_split(const struct firmware *fw, const char *fw_na |
| int i; |
| |
| ehdr = (struct elf32_hdr *)fw->data; |
| - phdrs = (struct elf32_phdr *)(ehdr + 1); |
| + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff); |
| |
| for (i = 0; i < ehdr->e_phnum; i++) { |
| /* |
| @@ -314,7 +314,7 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw, |
| |
| is_split = qcom_mdt_bins_are_split(fw, fw_name); |
| ehdr = (struct elf32_hdr *)fw->data; |
| - phdrs = (struct elf32_phdr *)(ehdr + 1); |
| + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff); |
| |
| for (i = 0; i < ehdr->e_phnum; i++) { |
| phdr = &phdrs[i]; |
| -- |
| 2.39.5 |
| |