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

Commit c315cf9d authored by Mohit Aggarwal's avatar Mohit Aggarwal
Browse files

diag: dci: Protect the client list and command entries



Currently, on open and close notification for channels,
the dci clients are updated accordingly. The list
traversal for active dci clients are not mutex protected.
Also searching for command registration in table is not
properly protected. This patch mutex protect the list
traversal and command registration table search to avoid
stale entries.

Change-Id: I015d6674afd605c63cd01ceec0109d9da5462629
Signed-off-by: default avatarMohit Aggarwal <maggarwa@codeaurora.org>
parent 64182585
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
/* 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
@@ -1371,6 +1371,7 @@ void diag_dci_notify_client(int peripheral_mask, int data, int proc)
		dci_ops_tbl[proc].peripheral_status &= ~peripheral_mask;

	/* Notify the DCI process that the peripheral DCI Channel is up */
	mutex_lock(&driver->dci_mutex);
	list_for_each_safe(start, temp, &driver->dci_client_list) {
		entry = list_entry(start, struct diag_dci_client_tbl, track);
		if (entry->client_info.token != proc)
@@ -1384,6 +1385,7 @@ void diag_dci_notify_client(int peripheral_mask, int data, int proc)
							info.si_int, stat);
		}
	}
	mutex_unlock(&driver->dci_mutex);
}

static int diag_send_dci_pkt(struct diag_cmd_reg_t *entry,
@@ -1856,6 +1858,7 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
	reg_entry.cmd_code_hi = header->subsys_cmd_code;
	reg_entry.cmd_code_lo = header->subsys_cmd_code;

	mutex_lock(&driver->cmd_reg_mutex);
	temp_entry = diag_cmd_search(&reg_entry, ALL_PROC);
	if (temp_entry) {
		reg_item = container_of(temp_entry, struct diag_cmd_reg_t,
@@ -1867,6 +1870,7 @@ static int diag_process_dci_pkt_rsp(unsigned char *buf, int len)
				reg_entry.cmd_code, reg_entry.subsys_id,
				reg_entry.cmd_code_hi);
	}
	mutex_unlock(&driver->cmd_reg_mutex);

	return ret;
}