diff options
author | Bjorn Andersson <bjorn.andersson@linaro.org> | 2017-01-27 05:06:36 -0500 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2017-02-06 11:57:24 -0500 |
commit | 3e8b571a9a0881ba3381ca0915995696da145ab8 (patch) | |
tree | 06e1df23a845b1b3a8495edf204bef84a9ec3e5d | |
parent | bde440eee27021617fcd33000209925cdc67db12 (diff) |
remoteproc: qcom: mdt_loader: Don't overwrite firmware object
The "fw" firmware object is passed from the remoteproc core and should
not be overwritten, as that results in leaked buffers and a double free
of the the last firmware object.
Fixes: 051fb70fd4ea ("remoteproc: qcom: Driver for the self-authenticating Hexagon v5")
Cc: stable@vger.kernel.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r-- | drivers/remoteproc/qcom_mdt_loader.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/remoteproc/qcom_mdt_loader.c b/drivers/remoteproc/qcom_mdt_loader.c index 897e14512123..fe7d5207ad17 100644 --- a/drivers/remoteproc/qcom_mdt_loader.c +++ b/drivers/remoteproc/qcom_mdt_loader.c | |||
@@ -97,6 +97,7 @@ int qcom_mdt_load(struct rproc *rproc, | |||
97 | const struct elf32_phdr *phdrs; | 97 | const struct elf32_phdr *phdrs; |
98 | const struct elf32_phdr *phdr; | 98 | const struct elf32_phdr *phdr; |
99 | const struct elf32_hdr *ehdr; | 99 | const struct elf32_hdr *ehdr; |
100 | const struct firmware *seg_fw; | ||
100 | size_t fw_name_len; | 101 | size_t fw_name_len; |
101 | char *fw_name; | 102 | char *fw_name; |
102 | void *ptr; | 103 | void *ptr; |
@@ -135,16 +136,16 @@ int qcom_mdt_load(struct rproc *rproc, | |||
135 | 136 | ||
136 | if (phdr->p_filesz) { | 137 | if (phdr->p_filesz) { |
137 | sprintf(fw_name + fw_name_len - 3, "b%02d", i); | 138 | sprintf(fw_name + fw_name_len - 3, "b%02d", i); |
138 | ret = request_firmware(&fw, fw_name, &rproc->dev); | 139 | ret = request_firmware(&seg_fw, fw_name, &rproc->dev); |
139 | if (ret) { | 140 | if (ret) { |
140 | dev_err(&rproc->dev, "failed to load %s\n", | 141 | dev_err(&rproc->dev, "failed to load %s\n", |
141 | fw_name); | 142 | fw_name); |
142 | break; | 143 | break; |
143 | } | 144 | } |
144 | 145 | ||
145 | memcpy(ptr, fw->data, fw->size); | 146 | memcpy(ptr, seg_fw->data, seg_fw->size); |
146 | 147 | ||
147 | release_firmware(fw); | 148 | release_firmware(seg_fw); |
148 | } | 149 | } |
149 | 150 | ||
150 | if (phdr->p_memsz > phdr->p_filesz) | 151 | if (phdr->p_memsz > phdr->p_filesz) |