aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaman Padhiar <npadhiar@codeaurora.org>2019-05-08 16:34:37 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2019-05-18 20:27:12 -0700
commit8c40d8266e4e6e1a50f26d5beb796a1aeaa3841e (patch)
tree8ea4648633874b2e97008198d568aa6e99f116af
parent8f1938efe1290caa18af576fe9502ed73432a1fe (diff)
icnss: Add check on msa regionLA.UM.7.6.2.r1-08700-89xx.0
When icnss receive server arrive it send wlfw_msa_mem_info_send_sync_msg QMI request to firmware and in response expect range of addresses and size to be mapped. Add condition to check whether addresses in response falls under valid range otherwise it asserts. Change-Id: I9a8542cb6c3b3cefe112d1f08a76dd2eadf68d2f Signed-off-by: Naman Padhiar <npadhiar@codeaurora.org>
-rw-r--r--drivers/soc/qcom/icnss.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index f3acd4113b06..c895d219cf85 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -1326,6 +1326,7 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
struct wlfw_msa_info_req_msg_v01 req;
struct wlfw_msa_info_resp_msg_v01 resp;
struct msg_desc req_desc, resp_desc;
+ uint64_t max_mapped_addr;
if (!penv || !penv->wlfw_clnt)
return -ENODEV;
@@ -1372,9 +1373,23 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
goto out;
}
+ max_mapped_addr = penv->msa_pa + penv->msa_mem_size;
penv->stats.msa_info_resp++;
penv->nr_mem_region = resp.mem_region_info_len;
for (i = 0; i < resp.mem_region_info_len; i++) {
+
+ if (resp.mem_region_info[i].size > penv->msa_mem_size ||
+ resp.mem_region_info[i].region_addr > max_mapped_addr ||
+ resp.mem_region_info[i].region_addr < penv->msa_pa ||
+ resp.mem_region_info[i].size +
+ resp.mem_region_info[i].region_addr > max_mapped_addr) {
+ icnss_pr_dbg("Received out of range Addr: 0x%llx Size: 0x%x\n",
+ resp.mem_region_info[i].region_addr,
+ resp.mem_region_info[i].size);
+ ret = -EINVAL;
+ goto fail_unwind;
+ }
+
penv->mem_region[i].reg_addr =
resp.mem_region_info[i].region_addr;
penv->mem_region[i].size =
@@ -1389,6 +1404,8 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
return 0;
+fail_unwind:
+ memset(&penv->mem_region[0], 0, sizeof(penv->mem_region[0]) * i);
out:
penv->stats.msa_info_err++;
ICNSS_QMI_ASSERT();