Skip to content

Commit

Permalink
media: v4l2-subdev: Verify v4l2_subdev_call() pointer arguments
Browse files Browse the repository at this point in the history
Parameters passed to check helpers are now obtained by dereferencing
unverified pointer arguments.  Check validity of those pointers first.

Signed-off-by: Janusz Krzysztofik <[email protected]>
Reviewed-by: Sakari Ailus <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
jkrzyszt authored and mchehab committed Jun 24, 2019
1 parent a8fa550 commit a4f4a76
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions drivers/media/v4l2-core/v4l2-subdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ static inline int check_pad(struct v4l2_subdev *sd, __u32 pad)
static inline int check_format(struct v4l2_subdev *sd,
struct v4l2_subdev_format *format)
{
if (!format)
return -EINVAL;

return check_which(format->which) ? : check_pad(sd, format->pad);
}

Expand All @@ -162,6 +165,9 @@ static int call_enum_mbus_code(struct v4l2_subdev *sd,
struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_mbus_code_enum *code)
{
if (!code)
return -EINVAL;

return check_which(code->which) ? : check_pad(sd, code->pad) ? :
sd->ops->pad->enum_mbus_code(sd, cfg, code);
}
Expand All @@ -170,13 +176,19 @@ static int call_enum_frame_size(struct v4l2_subdev *sd,
struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_frame_size_enum *fse)
{
if (!fse)
return -EINVAL;

return check_which(fse->which) ? : check_pad(sd, fse->pad) ? :
sd->ops->pad->enum_frame_size(sd, cfg, fse);
}

static inline int check_frame_interval(struct v4l2_subdev *sd,
struct v4l2_subdev_frame_interval *fi)
{
if (!fi)
return -EINVAL;

return check_pad(sd, fi->pad);
}

Expand All @@ -198,13 +210,19 @@ static int call_enum_frame_interval(struct v4l2_subdev *sd,
struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_frame_interval_enum *fie)
{
if (!fie)
return -EINVAL;

return check_which(fie->which) ? : check_pad(sd, fie->pad) ? :
sd->ops->pad->enum_frame_interval(sd, cfg, fie);
}

static inline int check_selection(struct v4l2_subdev *sd,
struct v4l2_subdev_selection *sel)
{
if (!sel)
return -EINVAL;

return check_which(sel->which) ? : check_pad(sd, sel->pad);
}

Expand All @@ -227,6 +245,9 @@ static int call_set_selection(struct v4l2_subdev *sd,
static inline int check_edid(struct v4l2_subdev *sd,
struct v4l2_subdev_edid *edid)
{
if (!edid)
return -EINVAL;

if (edid->blocks && edid->edid == NULL)
return -EINVAL;

Expand All @@ -246,13 +267,19 @@ static int call_set_edid(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid)
static int call_dv_timings_cap(struct v4l2_subdev *sd,
struct v4l2_dv_timings_cap *cap)
{
if (!cap)
return -EINVAL;

return check_pad(sd, cap->pad) ? :
sd->ops->pad->dv_timings_cap(sd, cap);
}

static int call_enum_dv_timings(struct v4l2_subdev *sd,
struct v4l2_enum_dv_timings *dvt)
{
if (!dvt)
return -EINVAL;

return check_pad(sd, dvt->pad) ? :
sd->ops->pad->enum_dv_timings(sd, dvt);
}
Expand Down

0 comments on commit a4f4a76

Please sign in to comment.