diff mbox series

[PATCHv2,for,v6.3] media: v4l2-subdev.c: clear stream field

Message ID ba940dce-39fd-fa3d-15b6-3f06afc57098@xs4all.nl (mailing list archive)
State New, archived
Headers show
Series [PATCHv2,for,v6.3] media: v4l2-subdev.c: clear stream field | expand

Commit Message

Hans Verkuil Feb. 16, 2023, 9:01 a.m. UTC
From 91d988c89ae7a8c26d6d7ad58b07efcf41d875da Mon Sep 17 00:00:00 2001
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date: Wed, 15 Feb 2023 15:48:17 +0100
Subject: [PATCH] media: v4l2-subdev.c: clear stream field

Both userspace and kernelspace can pass structs with an uninitialized 'stream'
field. Since the check_state() function checks for a non-zero stream field,
suddenly these calls will fails with -EINVAL.

So check in the wrapper functions in v4l2-subdev.c (which are used by both the
kernel and userspace API) if V4L2_SUBDEV_FL_STREAMS is set, and if not, then zero
the stream field.

Currently no drivers set V4L2_SUBDEV_FL_STREAMS, so the stream field will always
be set to 0.

This patch might well be reverted in the future when streams support is fully
enabled and we finalized the userspace API support for this feature.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:
- added newline after zeroing the stream field
- mention that this patch might be reverted in the future
---
 drivers/media/v4l2-core/v4l2-subdev.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
diff mbox series

Patch

diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
index 1bebcda2bd20..dff1d9be7841 100644
--- a/drivers/media/v4l2-core/v4l2-subdev.c
+++ b/drivers/media/v4l2-core/v4l2-subdev.c
@@ -197,6 +197,9 @@  static inline int check_format(struct v4l2_subdev *sd,
 	if (!format)
 		return -EINVAL;

+	if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS))
+		format->stream = 0;
+
 	return check_which(format->which) ? : check_pad(sd, format->pad) ? :
 	       check_state(sd, state, format->which, format->pad, format->stream);
 }
@@ -224,6 +227,9 @@  static int call_enum_mbus_code(struct v4l2_subdev *sd,
 	if (!code)
 		return -EINVAL;

+	if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS))
+		code->stream = 0;
+
 	return check_which(code->which) ? : check_pad(sd, code->pad) ? :
 	       check_state(sd, state, code->which, code->pad, code->stream) ? :
 	       sd->ops->pad->enum_mbus_code(sd, state, code);
@@ -236,6 +242,9 @@  static int call_enum_frame_size(struct v4l2_subdev *sd,
 	if (!fse)
 		return -EINVAL;

+	if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS))
+		fse->stream = 0;
+
 	return check_which(fse->which) ? : check_pad(sd, fse->pad) ? :
 	       check_state(sd, state, fse->which, fse->pad, fse->stream) ? :
 	       sd->ops->pad->enum_frame_size(sd, state, fse);
@@ -271,6 +280,9 @@  static int call_enum_frame_interval(struct v4l2_subdev *sd,
 	if (!fie)
 		return -EINVAL;

+	if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS))
+		fie->stream = 0;
+
 	return check_which(fie->which) ? : check_pad(sd, fie->pad) ? :
 	       check_state(sd, state, fie->which, fie->pad, fie->stream) ? :
 	       sd->ops->pad->enum_frame_interval(sd, state, fie);
@@ -283,6 +295,9 @@  static inline int check_selection(struct v4l2_subdev *sd,
 	if (!sel)
 		return -EINVAL;

+	if (!(sd->flags & V4L2_SUBDEV_FL_STREAMS))
+		sel->stream = 0;
+
 	return check_which(sel->which) ? : check_pad(sd, sel->pad) ? :
 	       check_state(sd, state, sel->which, sel->pad, sel->stream);
 }