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

Commit 2b092da5 authored by Seemanta Dutta's avatar Seemanta Dutta
Browse files

msm: camera: Do not use struct v4l2_event for private ioctl



struct v4l2_event should not be used for communication via
private ioctl because v4l2_event type is meant only for communication
through the V4L2 framework. Using this outside the framework for
custom ioctls will result in improper handling when 32/64 conversion
are needed.

So change the private ioctl handler in msm.c to not use this struct.
Also update the ioctl codes to use msm_v4l2_event_data instead of
v4l2_event.

Change-Id: I556de94de8676e4c1eb217f25c77a22a62465ee5
Signed-off-by: default avatarSeemanta Dutta <seemanta@codeaurora.org>
parent 9e1a1c1e
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -548,15 +548,13 @@ static long msm_private_ioctl(struct file *file, void *fh,
	bool valid_prio, unsigned int cmd, void *arg)
{
	int rc = 0;
	struct msm_v4l2_event_data *event_data;
	struct msm_v4l2_event_data *event_data = arg;
	struct v4l2_event event;
	struct msm_session *session;
	unsigned int session_id;
	unsigned int stream_id;
	unsigned long spin_flags = 0;

	event_data = (struct msm_v4l2_event_data *)
		((struct v4l2_event *)arg)->u.data;

	session_id = event_data->session_id;
	stream_id = event_data->stream_id;

@@ -572,9 +570,12 @@ static long msm_private_ioctl(struct file *file, void *fh,
			rc = -EFAULT;
			break;
		}

		event.type = event_data->v4l2_event_type;
		event.id = event_data->v4l2_event_id;
		memcpy(&event.u.data, event_data,
			sizeof(struct msm_v4l2_event_data));
		v4l2_event_queue(session->event_q.vdev,
			(struct v4l2_event *)arg);
			&event);
	}
		break;

@@ -600,7 +601,11 @@ static long msm_private_ioctl(struct file *file, void *fh,

		spin_lock_irqsave(&(session->command_ack_q.lock),
		   spin_flags);
		ret_cmd->event = *(struct v4l2_event *)arg;
		event.type = event_data->v4l2_event_type;
		event.id = event_data->v4l2_event_id;
		memcpy(&event.u.data, event_data,
			sizeof(struct msm_v4l2_event_data));
		memcpy(&ret_cmd->event, &event, sizeof(struct v4l2_event));
		msm_enqueue(&cmd_ack->command_q, &ret_cmd->list);
		complete(&cmd_ack->wait_complete);
		spin_unlock_irqrestore(&(session->command_ack_q.lock),
+6 −6
Original line number Diff line number Diff line
@@ -6,16 +6,16 @@
#include <linux/ioctl.h>

#define MSM_CAM_V4L2_IOCTL_NOTIFY \
	_IOW('V', BASE_VIDIOC_PRIVATE + 30, struct v4l2_event)
	_IOW('V', BASE_VIDIOC_PRIVATE + 30, struct msm_v4l2_event_data)

#define MSM_CAM_V4L2_IOCTL_NOTIFY_META \
	_IOW('V', BASE_VIDIOC_PRIVATE + 31, struct v4l2_event)
	_IOW('V', BASE_VIDIOC_PRIVATE + 31, struct msm_v4l2_event_data)

#define MSM_CAM_V4L2_IOCTL_CMD_ACK \
	_IOW('V', BASE_VIDIOC_PRIVATE + 32, struct v4l2_event)
	_IOW('V', BASE_VIDIOC_PRIVATE + 32, struct msm_v4l2_event_data)

#define MSM_CAM_V4L2_IOCTL_NOTIFY_ERROR \
	_IOW('V', BASE_VIDIOC_PRIVATE + 33, struct v4l2_event)
	_IOW('V', BASE_VIDIOC_PRIVATE + 33, struct msm_v4l2_event_data)

#define QCAMERA_DEVICE_GROUP_ID	1
#define QCAMERA_VNODE_GROUP_ID	2
@@ -117,9 +117,9 @@ struct msm_v4l2_event_data {
	/*word 8*/
	unsigned int ret_value;
	/*word 9*/
	unsigned int nop3;
	unsigned int v4l2_event_type;
	/*word 10*/
	unsigned int nop4;
	unsigned int v4l2_event_id;
	/*word 11*/
	unsigned int nop5;
	/*word 12*/