media: ti-vpe: cal: fix subdev mbus_code enumeration
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Thu, 4 Mar 2021 13:45:20 +0000 (14:45 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 22 Mar 2021 09:17:56 +0000 (10:17 +0100)
The cal_ctx_v4l2_init_formats() function does not handle error values
correctly when calling enum_mbus_code in subdevs, causing an infinite
loop if the subdev's enum_mbus_code returns some other error than EINVAL.

Fix the error handling.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/ti-vpe/cal-video.c

index 47bea40c64c223e02080acb3be54bf9db733b4b8..09a47a486215d4cd15e5749c61fe8a8573df492d 100644 (file)
@@ -591,15 +591,21 @@ static int cal_ctx_v4l2_init_formats(struct cal_ctx *ctx)
                                       sizeof(*ctx->active_fmt), GFP_KERNEL);
        ctx->num_active_fmt = 0;
 
-       for (j = 0, i = 0; ret != -EINVAL; ++j) {
+       for (j = 0, i = 0; ; ++j) {
 
                memset(&mbus_code, 0, sizeof(mbus_code));
                mbus_code.index = j;
                mbus_code.which = V4L2_SUBDEV_FORMAT_ACTIVE;
                ret = v4l2_subdev_call(ctx->phy->sensor, pad, enum_mbus_code,
                                       NULL, &mbus_code);
-               if (ret)
-                       continue;
+               if (ret == -EINVAL)
+                       break;
+
+               if (ret) {
+                       ctx_err(ctx, "Error enumerating mbus codes in subdev %s: %d\n",
+                               ctx->phy->sensor->name, ret);
+                       return ret;
+               }
 
                ctx_dbg(2, ctx,
                        "subdev %s: code: %04x idx: %u\n",