Skip to content

Commit 401a2d0

Browse files
Naman Padhiarjb-essential
authored andcommitted
icnss: Add check on msa region
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>
1 parent e7c726d commit 401a2d0

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

drivers/soc/qcom/icnss.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,7 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
12211221
struct wlfw_msa_info_req_msg_v01 req;
12221222
struct wlfw_msa_info_resp_msg_v01 resp;
12231223
struct msg_desc req_desc, resp_desc;
1224+
uint64_t max_mapped_addr;
12241225

12251226
if (!penv || !penv->wlfw_clnt)
12261227
return -ENODEV;
@@ -1267,9 +1268,23 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
12671268
goto out;
12681269
}
12691270

1271+
max_mapped_addr = penv->msa_pa + penv->msa_mem_size;
12701272
penv->stats.msa_info_resp++;
12711273
penv->nr_mem_region = resp.mem_region_info_len;
12721274
for (i = 0; i < resp.mem_region_info_len; i++) {
1275+
1276+
if (resp.mem_region_info[i].size > penv->msa_mem_size ||
1277+
resp.mem_region_info[i].region_addr > max_mapped_addr ||
1278+
resp.mem_region_info[i].region_addr < penv->msa_pa ||
1279+
resp.mem_region_info[i].size +
1280+
resp.mem_region_info[i].region_addr > max_mapped_addr) {
1281+
icnss_pr_dbg("Received out of range Addr: 0x%llx Size: 0x%x\n",
1282+
resp.mem_region_info[i].region_addr,
1283+
resp.mem_region_info[i].size);
1284+
ret = -EINVAL;
1285+
goto fail_unwind;
1286+
}
1287+
12731288
penv->mem_region[i].reg_addr =
12741289
resp.mem_region_info[i].region_addr;
12751290
penv->mem_region[i].size =
@@ -1284,6 +1299,8 @@ static int wlfw_msa_mem_info_send_sync_msg(void)
12841299

12851300
return 0;
12861301

1302+
fail_unwind:
1303+
memset(&penv->mem_region[0], 0, sizeof(penv->mem_region[0]) * i);
12871304
out:
12881305
penv->stats.msa_info_err++;
12891306
ICNSS_QMI_ASSERT();

0 commit comments

Comments
 (0)