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

Commit 386fb013 authored by Hardik Arya's avatar Hardik Arya Committed by Gerrit - the friendly Code Review server
Browse files

diag: Clearing the mask before switching logging mode



Currently there is a possibility of not clearing a mask
when logging mode is switched via ioctl. The patch adds
clearing of mask before switching logging mode from ioctl.

CRs-Fixed: 2206931
Change-Id: Iaff41e67c963b2333be0cf5853ad657764a71cc1
Signed-off-by: default avatarHardik Arya <harya@codeaurora.org>
parent 22980fb5
Loading
Loading
Loading
Loading
+0 −8
Original line number Original line Diff line number Diff line
@@ -1959,14 +1959,6 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
			__func__, mask_info->ptr, mask_info->update_buf);
			__func__, mask_info->ptr, mask_info->update_buf);
		return -EINVAL;
		return -EINVAL;
	}
	}
	mutex_lock(&driver->diag_maskclear_mutex);
	if (driver->mask_clear) {
		DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
		"diag:%s: count = %zu\n", __func__, count);
		mutex_unlock(&driver->diag_maskclear_mutex);
		return -EIO;
	}
	mutex_unlock(&driver->diag_maskclear_mutex);
	mutex_lock(&mask_info->lock);
	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);
	mutex_lock(&driver->msg_mask_lock);


+0 −2
Original line number Original line Diff line number Diff line
@@ -468,8 +468,6 @@ struct diagchar_dev {
	struct class *diagchar_class;
	struct class *diagchar_class;
	struct device *diag_dev;
	struct device *diag_dev;
	int ref_count;
	int ref_count;
	int mask_clear;
	struct mutex diag_maskclear_mutex;
	struct mutex diag_notifier_mutex;
	struct mutex diag_notifier_mutex;
	struct mutex diagchar_mutex;
	struct mutex diagchar_mutex;
	struct mutex diag_file_mutex;
	struct mutex diag_file_mutex;
+48 −8
Original line number Original line Diff line number Diff line
@@ -451,10 +451,6 @@ static void diag_close_logging_process(const int pid)
	if (diag_mask_clear_param)
	if (diag_mask_clear_param)
		diag_clear_masks(pid);
		diag_clear_masks(pid);


	mutex_lock(&driver->diag_maskclear_mutex);
	driver->mask_clear = 1;
	mutex_unlock(&driver->diag_maskclear_mutex);

	mutex_lock(&driver->diagchar_mutex);
	mutex_lock(&driver->diagchar_mutex);
	for (i = 0; i < NUM_MD_SESSIONS; i++)
	for (i = 0; i < NUM_MD_SESSIONS; i++)
		if (MD_PERIPHERAL_MASK(i) & session_peripheral_mask)
		if (MD_PERIPHERAL_MASK(i) & session_peripheral_mask)
@@ -536,9 +532,7 @@ static int diagchar_close(struct inode *inode, struct file *file)
	DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n",
	DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n",
		current->comm);
		current->comm);
	ret = diag_remove_client_entry(file);
	ret = diag_remove_client_entry(file);
	mutex_lock(&driver->diag_maskclear_mutex);

	driver->mask_clear = 0;
	mutex_unlock(&driver->diag_maskclear_mutex);
	return ret;
	return ret;
}
}


@@ -1609,6 +1603,51 @@ static uint32_t diag_translate_mask(uint32_t peripheral_mask)
	return ret;
	return ret;
}
}


static void diag_switch_logging_clear_mask(
		struct diag_logging_mode_param_t *param, int pid)
{
	int new_mode;
	struct diag_md_session_t *session_info = NULL;

	mutex_lock(&driver->md_session_lock);
	session_info = diag_md_session_get_pid(pid);
	if (!session_info) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE, "Invalid pid: %d\n", pid);
		mutex_unlock(&driver->md_session_lock);
		return;
	}
	mutex_unlock(&driver->md_session_lock);

	if (!param)
		return;

	if (!param->peripheral_mask) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
			"asking for mode switch with no peripheral mask set\n");
		return;
	}

	switch (param->req_mode) {
	case CALLBACK_MODE:
	case UART_MODE:
	case SOCKET_MODE:
	case MEMORY_DEVICE_MODE:
		new_mode = DIAG_MEMORY_DEVICE_MODE;
		break;
	case USB_MODE:
		new_mode = DIAG_USB_MODE;
		break;
	default:
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
			"Request to switch to invalid mode: %d\n",
			param->req_mode);
		return;
	}
	if ((new_mode == DIAG_USB_MODE) && diag_mask_clear_param)
		diag_clear_masks(pid);

}

static int diag_switch_logging(struct diag_logging_mode_param_t *param)
static int diag_switch_logging(struct diag_logging_mode_param_t *param)
{
{
	int new_mode;
	int new_mode;
@@ -2179,6 +2218,7 @@ long diagchar_compat_ioctl(struct file *filp,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
				   sizeof(mode_param)))
				   sizeof(mode_param)))
			return -EFAULT;
			return -EFAULT;
		diag_switch_logging_clear_mask(&mode_param, current->tgid);
		mutex_lock(&driver->diagchar_mutex);
		mutex_lock(&driver->diagchar_mutex);
		result = diag_switch_logging(&mode_param);
		result = diag_switch_logging(&mode_param);
		mutex_unlock(&driver->diagchar_mutex);
		mutex_unlock(&driver->diagchar_mutex);
@@ -2314,6 +2354,7 @@ long diagchar_ioctl(struct file *filp,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
				   sizeof(mode_param)))
				   sizeof(mode_param)))
			return -EFAULT;
			return -EFAULT;
		diag_switch_logging_clear_mask(&mode_param, current->tgid);
		mutex_lock(&driver->diagchar_mutex);
		mutex_lock(&driver->diagchar_mutex);
		result = diag_switch_logging(&mode_param);
		result = diag_switch_logging(&mode_param);
		mutex_unlock(&driver->diagchar_mutex);
		mutex_unlock(&driver->diagchar_mutex);
@@ -3583,7 +3624,6 @@ static int __init diagchar_init(void)
	non_hdlc_data.len = 0;
	non_hdlc_data.len = 0;
	mutex_init(&driver->hdlc_disable_mutex);
	mutex_init(&driver->hdlc_disable_mutex);
	mutex_init(&driver->diagchar_mutex);
	mutex_init(&driver->diagchar_mutex);
	mutex_init(&driver->diag_maskclear_mutex);
	mutex_init(&driver->diag_notifier_mutex);
	mutex_init(&driver->diag_notifier_mutex);
	mutex_init(&driver->diag_file_mutex);
	mutex_init(&driver->diag_file_mutex);
	mutex_init(&driver->delayed_rsp_mutex);
	mutex_init(&driver->delayed_rsp_mutex);