Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa: yt921x: Fix MIB overflow wraparound routine

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>

authored by

David Yang and committed by
Jakub Kicinski
709bbb01 ca12c4a1

+8 -7
+8 -7
drivers/net/dsa/yt921x.c
··· 682 682 const struct yt921x_mib_desc *desc = &yt921x_mib_descs[i]; 683 683 u32 reg = YT921X_MIBn_DATA0(port) + desc->offset; 684 684 u64 *valp = &((u64 *)mib)[i]; 685 - u64 val = *valp; 686 685 u32 val0; 687 - u32 val1; 686 + u64 val; 688 687 689 688 res = yt921x_reg_read(priv, reg, &val0); 690 689 if (res) 691 690 break; 692 691 693 692 if (desc->size <= 1) { 694 - if (val < (u32)val) 695 - /* overflow */ 696 - val += (u64)U32_MAX + 1; 697 - val &= ~U32_MAX; 698 - val |= val0; 693 + u64 old_val = *valp; 694 + 695 + val = (old_val & ~(u64)U32_MAX) | val0; 696 + if (val < old_val) 697 + val += 1ull << 32; 699 698 } else { 699 + u32 val1; 700 + 700 701 res = yt921x_reg_read(priv, reg + 4, &val1); 701 702 if (res) 702 703 break;