On Tue Jun 30 12:52:57 2026 +0200, Yousef Alhouseen wrote:
> The byte-alignment paths can call CODE_ADD() with a zero bit
> length.  The macro then shifts an int by name.b, which can be 32
> after the preceding bit was flushed.
> 
> vti_bitlen() can likewise shift a signed int into its sign bit while
> searching for the bit length, and the package mask construction can
> shift by the full type width.
> 
> Make zero-length additions a no-op, derive the bit length with fls(),
> and build the mask with GENMASK().
> 
> Signed-off-by: Yousef Alhouseen <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/usb/go7007/go7007-fw.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

---

diff --git a/drivers/media/usb/go7007/go7007-fw.c 
b/drivers/media/usb/go7007/go7007-fw.c
index 86ce593e0c54..8cf959c20e30 100644
--- a/drivers/media/usb/go7007/go7007-fw.c
+++ b/drivers/media/usb/go7007/go7007-fw.c
@@ -13,6 +13,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/bitops.h>
 #include <linux/time.h>
 #include <linux/mm.h>
 #include <linux/device.h>
@@ -58,14 +59,16 @@ struct code_gen {
 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
 
 #define CODE_ADD(name, val, length) do { \
-       name.b -= (length); \
-       name.a |= (val) << name.b; \
-       while (name.b <= 24) { \
-               *name.p = name.a >> 24; \
-               ++name.p; \
-               name.a <<= 8; \
-               name.b += 8; \
-               name.len += 8; \
+       if (length) { \
+               name.b -= (length); \
+               name.a |= (val) << name.b; \
+               while (name.b <= 24) { \
+                       *name.p = name.a >> 24; \
+                       ++name.p; \
+                       name.a <<= 8; \
+                       name.b += 8; \
+                       name.len += 8; \
+               } \
        } \
 } while (0)
 
@@ -707,11 +710,10 @@ done:
 
 static int vti_bitlen(struct go7007 *go)
 {
-       unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
+       unsigned int max_time_incr = go->sensor_framerate / go->fps_scale;
+       int bitlen = fls(max_time_incr);
 
-       for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i)
-               ;
-       return i + 1;
+       return bitlen ?: 1;
 }
 
 static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
@@ -1209,7 +1211,7 @@ static int seqhead_to_package(struct go7007 *go, __le16 
*code, int space,
                0xbf08,         fps,
                0xbf09,         0,
                0xbff2,         vop_time_increment_bitlength,
-               0xbff3,         (1 << vop_time_increment_bitlength) - 1,
+               0xbff3,         GENMASK(vop_time_increment_bitlength - 1, 0),
                0xbfe6,         0,
                0xbfe7,         (fps / 1000) << 8,
                0,              0,
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to