Commit 298c62d3 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mauro Carvalho Chehab
Browse files

media: v4l2-ctrl: Validate VP8 stateless decoder controls



Only one field needs to be validated: 'num_dct_parts'.
This field is used to iterate over the user-provided array
'dct_part_sizes'.

Signed-off-by: default avatarEzequiel Garcia <ezequiel@collabora.com>
[hverkuil-cisco@xs4all.nl: s -> (s) in zero_padding macro]
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent a57d6aca
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -1633,10 +1633,15 @@ static void std_log(const struct v4l2_ctrl *ctrl)
})

/* Validate a new control */

#define zero_padding(s) \
	memset(&(s).padding, 0, sizeof((s).padding))

static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
				 union v4l2_ctrl_ptr ptr)
{
	struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
	struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
	void *p = ptr.p + idx * ctrl->elem_size;

	switch ((u32)ctrl->type) {
@@ -1696,6 +1701,22 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
		break;

	case V4L2_CTRL_TYPE_VP8_FRAME_HEADER:
		p_vp8_frame_header = p;

		switch (p_vp8_frame_header->num_dct_parts) {
		case 1:
		case 2:
		case 4:
		case 8:
			break;
		default:
			return -EINVAL;
		}
		zero_padding(p_vp8_frame_header->segment_header);
		zero_padding(p_vp8_frame_header->lf_header);
		zero_padding(p_vp8_frame_header->quant_header);
		zero_padding(p_vp8_frame_header->entropy_header);
		zero_padding(p_vp8_frame_header->coder_state);
		break;
	default:
		return -EINVAL;