diff options
author | Zhen Kong <zkong@codeaurora.org> | 2016-01-11 10:50:31 -0800 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:17:04 -0700 |
commit | c3a112da961becb52c2a84a0e755fb0ba9668c1a (patch) | |
tree | c8231fd60c3910364a35ee1ef8b3018e3d3fe690 | |
parent | 2740b9fcaaa158374e8903b7b58c7dacc76bbd2e (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.c | 42 |
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; } |