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

Commit bbffe3ea authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: fix a blocked listener request issue"

parents 46bf9c46 324a6461
Loading
Loading
Loading
Loading
+27 −17
Original line number Diff line number Diff line
@@ -335,6 +335,7 @@ struct qseecom_client_handle {
	char app_name[MAX_APP_NAME_SIZE];
	u32  app_arch;
	struct qseecom_sec_buf_fd_info sec_buf_fd[MAX_ION_FD];
	bool from_smcinvoke;
};

struct qseecom_listener_handle {
@@ -2099,6 +2100,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener(
	sigset_t old_sigset;
	unsigned long flags;
	bool found_app = false;
	struct qseecom_registered_app_list dummy_app_entry = { {NULL} };

	if (!resp || !data) {
		pr_err("invalid resp or data pointer\n");
@@ -2107,10 +2109,16 @@ static int __qseecom_process_reentrancy_blocked_on_listener(
	}

	/* find app_id & img_name from list */
	if (!ptr_app && data->client.app_arch != ELFCLASSNONE) {
		spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
		list_for_each_entry(ptr_app, &qseecom.registered_app_list_head,
							list) {
	if (!ptr_app) {
		if (data->client.from_smcinvoke) {
			pr_debug("This request is from smcinvoke\n");
			ptr_app = &dummy_app_entry;
			ptr_app->app_id = data->client.app_id;
		} else {
			spin_lock_irqsave(&qseecom.registered_app_list_lock,
						flags);
			list_for_each_entry(ptr_app,
				&qseecom.registered_app_list_head, list) {
				if ((ptr_app->app_id == data->client.app_id) &&
					(!strcmp(ptr_app->app_name,
						data->client.app_name))) {
@@ -2118,8 +2126,8 @@ static int __qseecom_process_reentrancy_blocked_on_listener(
					break;
				}
			}
		spin_unlock_irqrestore(&qseecom.registered_app_list_lock,
					flags);
			spin_unlock_irqrestore(
				&qseecom.registered_app_list_lock, flags);
			if (!found_app) {
				pr_err("app_id %d (%s) is not found\n",
					data->client.app_id,
@@ -2128,6 +2136,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener(
				goto exit;
			}
		}
	}

	do {
		session_id = resp->resp_type;
@@ -4963,6 +4972,7 @@ int qseecom_process_listener_from_smcinvoke(struct scm_desc *desc)
	resp.data = desc->ret[2];	/*listener_id*/

	dummy_private_data.client.app_id = desc->ret[1];
	dummy_private_data.client.from_smcinvoke = true;
	dummy_app_entry.app_id = desc->ret[1];

	mutex_lock(&app_access_lock);