media: mc: Fix flags handling when creating pad links

[ Upstream commit 422f7af75d03d50895938d38bc9cb8be759c440f ]

The media_create_pad_link() function doesn't correctly clear reject link
type flags, nor does it set the DATA_LINK flag. It only works because
the MEDIA_LNK_FL_DATA_LINK flag's value is 0.

Fix it by returning an error if any link type flag is set. This doesn't
introduce any regression, as nobody calls the media_create_pad_link()
function with link type flags (easily checked by grepping for the flag
in the source code, there are very few hits).

Set the MEDIA_LNK_FL_DATA_LINK explicitly, which is a no-op that the
compiler will optimize out, but is still useful to make the code more
explicit and easier to understand.

Cc: stable@vger.kernel.org # 6.1
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Laurent Pinchart 2024-01-15 00:24:12 +02:00 committed by Greg Kroah-Hartman
parent cc088ebf8b
commit 0a76902247
1 changed files with 6 additions and 1 deletions

View File

@ -1079,6 +1079,11 @@ media_create_pad_link(struct media_entity *source, u16 source_pad,
struct media_link *link; struct media_link *link;
struct media_link *backlink; struct media_link *backlink;
if (flags & MEDIA_LNK_FL_LINK_TYPE)
return -EINVAL;
flags |= MEDIA_LNK_FL_DATA_LINK;
if (WARN_ON(!source || !sink) || if (WARN_ON(!source || !sink) ||
WARN_ON(source_pad >= source->num_pads) || WARN_ON(source_pad >= source->num_pads) ||
WARN_ON(sink_pad >= sink->num_pads)) WARN_ON(sink_pad >= sink->num_pads))
@ -1094,7 +1099,7 @@ media_create_pad_link(struct media_entity *source, u16 source_pad,
link->source = &source->pads[source_pad]; link->source = &source->pads[source_pad];
link->sink = &sink->pads[sink_pad]; link->sink = &sink->pads[sink_pad];
link->flags = flags & ~MEDIA_LNK_FL_INTERFACE_LINK; link->flags = flags;
/* Initialize graph object embedded at the new link */ /* Initialize graph object embedded at the new link */
media_gobj_create(source->graph_obj.mdev, MEDIA_GRAPH_LINK, media_gobj_create(source->graph_obj.mdev, MEDIA_GRAPH_LINK,