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

Commit be64e222 authored by Mohit Aggarwal's avatar Mohit Aggarwal Committed by Bernhard Thoben
Browse files

diag: Fix for possible dci stale entries



This patch provides the protection to dci client
entries from corruption.

CRs-Fixed: 984942 992683
Bug: 62378232
Change-Id: Ifcd9f14dc03d9e42a31b3e126839489881e98303
Signed-off-by: default avatarManoj Prabhu B <bmanoj@codeaurora.org>
Signed-off-by: default avatarMohit Aggarwal <maggarwa@codeaurora.org>
(cherry picked from commit 1ede4694d5b28e1992c61613d67a6e3a18f96222)
parent cb54b9db
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1325,6 +1325,7 @@ void diag_update_smd_dci_work_fn(struct work_struct *work)
	 * which log entries in the cumulative logs that need
	 * which log entries in the cumulative logs that need
	 * to be updated on the peripheral.
	 * to be updated on the peripheral.
	 */
	 */
	mutex_lock(&driver->dci_mutex);
	list_for_each_safe(start, temp, &driver->dci_client_list) {
	list_for_each_safe(start, temp, &driver->dci_client_list) {
		entry = list_entry(start, struct diag_dci_client_tbl, track);
		entry = list_entry(start, struct diag_dci_client_tbl, track);
		if (entry->client_info.token != DCI_LOCAL_PROC)
		if (entry->client_info.token != DCI_LOCAL_PROC)
@@ -1336,6 +1337,7 @@ void diag_update_smd_dci_work_fn(struct work_struct *work)
			client_log_mask_ptr += 514;
			client_log_mask_ptr += 514;
		}
		}
	}
	}
	mutex_unlock(&driver->dci_mutex);


	mutex_lock(&dci_log_mask_mutex);
	mutex_lock(&dci_log_mask_mutex);
	/* Update the appropriate dirty bits in the cumulative mask */
	/* Update the appropriate dirty bits in the cumulative mask */
@@ -3122,8 +3124,6 @@ int diag_dci_deinit_client(struct diag_dci_client_tbl *entry)
	}
	}
	queue_work(driver->diag_real_time_wq, &driver->diag_real_time_work);
	queue_work(driver->diag_real_time_wq, &driver->diag_real_time_work);


	mutex_unlock(&driver->dci_mutex);

	return DIAG_DCI_NO_ERROR;
	return DIAG_DCI_NO_ERROR;
}
}


+45 −5
Original line number Original line Diff line number Diff line
@@ -348,9 +348,11 @@ static int diagchar_close(struct inode *inode, struct file *file)
	* This will specially help in case of ungraceful exit of any DCI client
	* This will specially help in case of ungraceful exit of any DCI client
	* This call will remove any pending registrations of such client
	* This call will remove any pending registrations of such client
	*/
	*/
	dci_entry = dci_lookup_client_entry_pid(current->tgid);
	mutex_lock(&driver->dci_mutex);
	dci_entry = dci_lookup_client_entry_pid(current->pid);
	if (dci_entry)
	if (dci_entry)
		diag_dci_deinit_client(dci_entry);
		diag_dci_deinit_client(dci_entry);
	mutex_unlock(&driver->dci_mutex);
	/* If the exiting process is the socket process */
	/* If the exiting process is the socket process */
	mutex_lock(&driver->diagchar_mutex);
	mutex_lock(&driver->diagchar_mutex);
	if (driver->socket_process &&
	if (driver->socket_process &&
@@ -1263,16 +1265,25 @@ long diagchar_compat_ioctl(struct file *filp,
		dci_client = diag_dci_get_client_entry(client_id);
		dci_client = diag_dci_get_client_entry(client_id);
		if (!dci_client)
		if (!dci_client)
			return DIAG_DCI_NOT_SUPPORTED;
			return DIAG_DCI_NOT_SUPPORTED;
<<<<<<< HEAD
=======
		}
>>>>>>> 1ede4694d5b2 (diag: Fix for possible dci stale entries)
		result = diag_dci_deinit_client(dci_client);
		result = diag_dci_deinit_client(dci_client);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_SUPPORT:
	case DIAG_IOCTL_DCI_SUPPORT:
		result = diag_ioctl_dci_support(ioarg);
		result = diag_ioctl_dci_support(ioarg);
		break;
		break;
	case DIAG_IOCTL_DCI_HEALTH_STATS:
	case DIAG_IOCTL_DCI_HEALTH_STATS:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_dci_health_stats(ioarg);
		result = diag_ioctl_dci_health_stats(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_LOG_STATUS:
	case DIAG_IOCTL_DCI_LOG_STATUS:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_dci_log_status(ioarg);
		result = diag_ioctl_dci_log_status(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_EVENT_STATUS:
	case DIAG_IOCTL_DCI_EVENT_STATUS:
		mutex_lock(&driver->dci_mutex);
		mutex_lock(&driver->dci_mutex);
@@ -1280,16 +1291,24 @@ long diagchar_compat_ioctl(struct file *filp,
		mutex_unlock(&driver->dci_mutex);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_CLEAR_LOGS:
	case DIAG_IOCTL_DCI_CLEAR_LOGS:
		mutex_lock(&driver->dci_mutex);
		if (copy_from_user((void *)&client_id, (void __user *)ioarg,
		if (copy_from_user((void *)&client_id, (void __user *)ioarg,
			sizeof(int)))
			sizeof(int))) {
			mutex_unlock(&driver->dci_mutex);
			return -EFAULT;
			return -EFAULT;
		}
		result = diag_dci_clear_log_mask(client_id);
		result = diag_dci_clear_log_mask(client_id);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_CLEAR_EVENTS:
	case DIAG_IOCTL_DCI_CLEAR_EVENTS:
		mutex_lock(&driver->dci_mutex);
		if (copy_from_user(&client_id, (void __user *)ioarg,
		if (copy_from_user(&client_id, (void __user *)ioarg,
			sizeof(int)))
			sizeof(int))) {
			mutex_unlock(&driver->dci_mutex);
			return -EFAULT;
			return -EFAULT;
		}
		result = diag_dci_clear_event_mask(client_id);
		result = diag_dci_clear_event_mask(client_id);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_LSM_DEINIT:
	case DIAG_IOCTL_LSM_DEINIT:
		result = diag_ioctl_lsm_deinit();
		result = diag_ioctl_lsm_deinit();
@@ -1309,7 +1328,9 @@ long diagchar_compat_ioctl(struct file *filp,
			result = 1;
			result = 1;
		break;
		break;
	case DIAG_IOCTL_VOTE_REAL_TIME:
	case DIAG_IOCTL_VOTE_REAL_TIME:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_vote_real_time(ioarg);
		result = diag_ioctl_vote_real_time(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_GET_REAL_TIME:
	case DIAG_IOCTL_GET_REAL_TIME:
		result = diag_ioctl_get_real_time(ioarg);
		result = diag_ioctl_get_real_time(ioarg);
@@ -1362,16 +1383,25 @@ long diagchar_ioctl(struct file *filp,
		dci_client = diag_dci_get_client_entry(client_id);
		dci_client = diag_dci_get_client_entry(client_id);
		if (!dci_client)
		if (!dci_client)
			return DIAG_DCI_NOT_SUPPORTED;
			return DIAG_DCI_NOT_SUPPORTED;
<<<<<<< HEAD
=======
		}
>>>>>>> 1ede4694d5b2 (diag: Fix for possible dci stale entries)
		result = diag_dci_deinit_client(dci_client);
		result = diag_dci_deinit_client(dci_client);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_SUPPORT:
	case DIAG_IOCTL_DCI_SUPPORT:
		result = diag_ioctl_dci_support(ioarg);
		result = diag_ioctl_dci_support(ioarg);
		break;
		break;
	case DIAG_IOCTL_DCI_HEALTH_STATS:
	case DIAG_IOCTL_DCI_HEALTH_STATS:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_dci_health_stats(ioarg);
		result = diag_ioctl_dci_health_stats(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_LOG_STATUS:
	case DIAG_IOCTL_DCI_LOG_STATUS:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_dci_log_status(ioarg);
		result = diag_ioctl_dci_log_status(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_EVENT_STATUS:
	case DIAG_IOCTL_DCI_EVENT_STATUS:
		mutex_lock(&driver->dci_mutex);
		mutex_lock(&driver->dci_mutex);
@@ -1379,16 +1409,24 @@ long diagchar_ioctl(struct file *filp,
		mutex_unlock(&driver->dci_mutex);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_CLEAR_LOGS:
	case DIAG_IOCTL_DCI_CLEAR_LOGS:
		mutex_lock(&driver->dci_mutex);
		if (copy_from_user((void *)&client_id, (void __user *)ioarg,
		if (copy_from_user((void *)&client_id, (void __user *)ioarg,
			sizeof(int)))
			sizeof(int))) {
			mutex_unlock(&driver->dci_mutex);
			return -EFAULT;
			return -EFAULT;
		}
		result = diag_dci_clear_log_mask(client_id);
		result = diag_dci_clear_log_mask(client_id);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_DCI_CLEAR_EVENTS:
	case DIAG_IOCTL_DCI_CLEAR_EVENTS:
		mutex_lock(&driver->dci_mutex);
		if (copy_from_user(&client_id, (void __user *)ioarg,
		if (copy_from_user(&client_id, (void __user *)ioarg,
			sizeof(int)))
			sizeof(int))) {
			mutex_unlock(&driver->dci_mutex);
			return -EFAULT;
			return -EFAULT;
		}
		result = diag_dci_clear_event_mask(client_id);
		result = diag_dci_clear_event_mask(client_id);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_LSM_DEINIT:
	case DIAG_IOCTL_LSM_DEINIT:
		result = diag_ioctl_lsm_deinit();
		result = diag_ioctl_lsm_deinit();
@@ -1408,7 +1446,9 @@ long diagchar_ioctl(struct file *filp,
			result = 1;
			result = 1;
		break;
		break;
	case DIAG_IOCTL_VOTE_REAL_TIME:
	case DIAG_IOCTL_VOTE_REAL_TIME:
		mutex_lock(&driver->dci_mutex);
		result = diag_ioctl_vote_real_time(ioarg);
		result = diag_ioctl_vote_real_time(ioarg);
		mutex_unlock(&driver->dci_mutex);
		break;
		break;
	case DIAG_IOCTL_GET_REAL_TIME:
	case DIAG_IOCTL_GET_REAL_TIME:
		result = diag_ioctl_get_real_time(ioarg);
		result = diag_ioctl_get_real_time(ioarg);