summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorjitendrathakare <jitendrathakare@codeaurora.org>2019-08-23 13:30:27 +0530
committerPrerna Kalla <prernak@codeaurora.org>2019-09-24 20:15:28 +0530
commit2e14413b3c9c000d7ed7e381ace60d5b3b568267 (patch)
treecd30448eae17a51e23cdedd717418beec5b24b21 /drivers/misc
parentc932d4ad3dbe9752029a282cef77455ccc240d0e (diff)
qseecom: correct range check in __qseecom_update_cmd_buf_64
Make change to validate if there exists enough space to write a unit64 instead of a unit32 value, in __qseecom_update_cmd_buf_64. Change-Id: Iabf61dea240f16108e1765585aae3a12d2d651c9 Signed-off-by: jitendra thakare <jitendrathakare@codeaurora.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/qseecom.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index f4aed78cac92..dfa3bb6b186f 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -3265,6 +3265,33 @@ int __boundary_checks_offset(struct qseecom_send_modfd_cmd_req *req,
return 0;
}
+static int __boundary_checks_offset_64(struct qseecom_send_modfd_cmd_req *req,
+ struct qseecom_send_modfd_listener_resp *lstnr_resp,
+ struct qseecom_dev_handle *data, int i)
+{
+
+ if ((data->type != QSEECOM_LISTENER_SERVICE) &&
+ (req->ifd_data[i].fd > 0)) {
+ if ((req->cmd_req_len < sizeof(uint64_t)) ||
+ (req->ifd_data[i].cmd_buf_offset >
+ req->cmd_req_len - sizeof(uint64_t))) {
+ pr_err("Invalid offset (req len) 0x%x\n",
+ req->ifd_data[i].cmd_buf_offset);
+ return -EINVAL;
+ }
+ } else if ((data->type == QSEECOM_LISTENER_SERVICE) &&
+ (lstnr_resp->ifd_data[i].fd > 0)) {
+ if ((lstnr_resp->resp_len < sizeof(uint64_t)) ||
+ (lstnr_resp->ifd_data[i].cmd_buf_offset >
+ lstnr_resp->resp_len - sizeof(uint64_t))) {
+ pr_err("Invalid offset (lstnr resp len) 0x%x\n",
+ lstnr_resp->ifd_data[i].cmd_buf_offset);
+ return -EINVAL;
+ }
+ }
+ return 0;
+}
+
static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
struct qseecom_dev_handle *data)
{
@@ -3622,7 +3649,8 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
sg = sg_ptr->sgl;
if (sg_ptr->nents == 1) {
uint64_t *update_64bit;
- if (__boundary_checks_offset(req, lstnr_resp, data, i))
+ if (__boundary_checks_offset_64(req, lstnr_resp,
+ data, i))
goto err;
/* 64bit app uses 64bit address */
update_64bit = (uint64_t *) field;