Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b45a2950 authored by Zhen Kong's avatar Zhen Kong
Browse files

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: default avatarZhen Kong <zkong@codeaurora.org>
parent 60d83900
Loading
Loading
Loading
Loading
+22 −20
Original line number Diff line number Diff line
/*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
@@ -1762,9 +1762,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;
		}
@@ -1984,6 +1982,16 @@ 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;
		/*
		* 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;
@@ -2003,6 +2011,9 @@ 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;
	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;
@@ -2075,9 +2086,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;
@@ -2603,7 +2613,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;

@@ -2612,11 +2621,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;
		}
@@ -5744,9 +5750,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;
		}
@@ -5915,9 +5919,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;
		}