]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: dsa: yt921x: Fix MIB overflow wraparound routine
authorDavid Yang <mmyangfl@gmail.com>
Thu, 22 Jan 2026 17:05:09 +0000 (01:05 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sun, 25 Jan 2026 23:16:01 +0000 (15:16 -0800)
Reported by the following Smatch static checker warning:

  drivers/net/dsa/yt921x.c:702 yt921x_read_mib()
  warn: was expecting a 64 bit value instead of '(~0)'

Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Closes: https://lore.kernel.org/netdev/aPsjYKQMzpY0nSXm@stanley.mountain/
Suggested-by: David Laight <david.laight.linux@gmail.com>
Signed-off-by: David Yang <mmyangfl@gmail.com>
Link: https://patch.msgid.link/20260122170512.2713738-1-mmyangfl@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/yt921x.c

index 1c511f5dc6ab23626ab1bda14d93b204447591aa..7b8c1549a0fb570c2509419c9b8d4bab0e4788f9 100644 (file)
@@ -682,21 +682,22 @@ static int yt921x_read_mib(struct yt921x_priv *priv, int port)
                const struct yt921x_mib_desc *desc = &yt921x_mib_descs[i];
                u32 reg = YT921X_MIBn_DATA0(port) + desc->offset;
                u64 *valp = &((u64 *)mib)[i];
-               u64 val = *valp;
                u32 val0;
-               u32 val1;
+               u64 val;
 
                res = yt921x_reg_read(priv, reg, &val0);
                if (res)
                        break;
 
                if (desc->size <= 1) {
-                       if (val < (u32)val)
-                               /* overflow */
-                               val += (u64)U32_MAX + 1;
-                       val &= ~U32_MAX;
-                       val |= val0;
+                       u64 old_val = *valp;
+
+                       val = (old_val & ~(u64)U32_MAX) | val0;
+                       if (val < old_val)
+                               val += 1ull << 32;
                } else {
+                       u32 val1;
+
                        res = yt921x_reg_read(priv, reg + 4, &val1);
                        if (res)
                                break;