summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhen Kong <zkong@codeaurora.org>2016-01-11 10:50:31 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:17:04 -0700
commitc3a112da961becb52c2a84a0e755fb0ba9668c1a (patch)
treec8231fd60c3910364a35ee1ef8b3018e3d3fe690
parent2740b9fcaaa158374e8903b7b58c7dacc76bbd2e (diff)
qseecom: fix an error related to app name comparision
Make changes to use strcmp to compare app name, and avoid the memcpy comparision error if the first several chars of an app name is exactly equal to another app name. Besides, on some targets, keymaster app may be first loaded as "keymaste" by qseecomd, and then used as "keymaster". To avoid checking app name error, register "keymaster" into app_list and thread private data. Change-Id: I468b4e5cb1d5d77ac5d687d0bddc8614b972785f Signed-off-by: Zhen Kong <zkong@codeaurora.org>
-rw-r--r--drivers/misc/qseecom.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 62f761f38159..47f8536da521 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -1,6 +1,6 @@
/*Qualcomm Secure Execution Environment Communicator (QSEECOM) driver
*
- * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1765,9 +1765,7 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req)
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
list_for_each_entry(entry,
&qseecom.registered_app_list_head, list) {
- if (!memcmp(entry->app_name,
- req.app_name,
- strlen(req.app_name))) {
+ if (!strcmp(entry->app_name, req.app_name)) {
found_app = true;
break;
}
@@ -1987,7 +1985,17 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
entry->app_id = app_id;
entry->ref_cnt = 1;
entry->app_arch = load_img_req.app_arch;
- strlcpy(entry->app_name, load_img_req.img_name,
+ /*
+ * keymaster app may be first loaded as "keymaste" by qseecomd,
+ * and then used as "keymaster" on some targets. To avoid app
+ * name checking error, register "keymaster" into app_list and
+ * thread private data.
+ */
+ if (!strcmp(load_img_req.img_name, "keymaste"))
+ strlcpy(entry->app_name, "keymaster",
+ MAX_APP_NAME_SIZE);
+ else
+ strlcpy(entry->app_name, load_img_req.img_name,
MAX_APP_NAME_SIZE);
entry->app_blocked = false;
entry->blocked_on_listener_id = 0;
@@ -2006,7 +2014,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
}
data->client.app_id = app_id;
data->client.app_arch = load_img_req.app_arch;
- strlcpy(data->client.app_name, load_img_req.img_name,
+ if (!strcmp(load_img_req.img_name, "keymaste"))
+ strlcpy(data->client.app_name, "keymaster", MAX_APP_NAME_SIZE);
+ else
+ strlcpy(data->client.app_name, load_img_req.img_name,
MAX_APP_NAME_SIZE);
load_img_req.app_id = app_id;
if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) {
@@ -2078,9 +2089,8 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data,
list_for_each_entry(ptr_app, &qseecom.registered_app_list_head,
list) {
if (ptr_app->app_id == data->client.app_id) {
- if (!memcmp((void *)ptr_app->app_name,
- (void *)data->client.app_name,
- strlen(data->client.app_name))) {
+ if (!strcmp((void *)ptr_app->app_name,
+ (void *)data->client.app_name)) {
found_app = true;
if (app_crash || ptr_app->ref_cnt == 1)
unload = true;
@@ -2606,7 +2616,6 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data,
unsigned long flags;
struct qseecom_registered_app_list *ptr_app;
bool found_app = false;
- int name_len = 0;
void *cmd_buf = NULL;
size_t cmd_len;
@@ -2615,11 +2624,8 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data,
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
list_for_each_entry(ptr_app, &qseecom.registered_app_list_head,
list) {
- name_len = min(strlen(data->client.app_name),
- strlen(ptr_app->app_name));
if ((ptr_app->app_id == data->client.app_id) &&
- (!memcmp(ptr_app->app_name,
- data->client.app_name, name_len))) {
+ (!strcmp(ptr_app->app_name, data->client.app_name))) {
found_app = true;
break;
}
@@ -5811,9 +5817,7 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data,
list_for_each_entry(ptr_app, &qseecom.registered_app_list_head,
list) {
if ((ptr_app->app_id == data->client.app_id) &&
- (!memcmp(ptr_app->app_name,
- data->client.app_name,
- strlen(ptr_app->app_name)))) {
+ (!strcmp(ptr_app->app_name, data->client.app_name))) {
found_app = true;
break;
}
@@ -5982,9 +5986,7 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data,
list_for_each_entry(ptr_app, &qseecom.registered_app_list_head,
list) {
if ((ptr_app->app_id == data->client.app_id) &&
- (!memcmp(ptr_app->app_name,
- data->client.app_name,
- strlen(ptr_app->app_name)))) {
+ (!strcmp(ptr_app->app_name, data->client.app_name))) {
found_app = true;
break;
}