The sd argument of this macro can be a more complex expression. Since it
is used 5 times in the macro it can be evaluated that many times as well.

So assign it to a temp variable in the beginning and use that instead.

This also avoids any potential side-effects of evaluating sd.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
---
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 47af609dc8f1..34da094a3f40 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -1093,13 +1093,14 @@ void v4l2_subdev_init(struct v4l2_subdev *sd,
  */
 #define v4l2_subdev_call(sd, o, f, args...)                            \
        ({                                                              \
+               struct v4l2_subdev *__sd = (sd);                        \
                int __result;                                           \
-               if (!(sd))                                              \
+               if (!__sd)                                              \
                        __result = -ENODEV;                             \
-               else if (!((sd)->ops->o && (sd)->ops->o->f))            \
+               else if (!(__sd->ops->o && __sd->ops->o->f))            \
                        __result = -ENOIOCTLCMD;                        \
                else                                                    \
-                       __result = (sd)->ops->o->f((sd), ##args);       \
+                       __result = __sd->ops->o->f(__sd, ##args);       \
                __result;                                               \
        })

Reply via email to