]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
net: phy: Fix signed shift overflow
authorEugeniu Rosca <erosca@de.adit-jv.com>
Thu, 4 Jan 2024 04:26:23 +0000 (05:26 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 26 Mar 2024 23:58:26 +0000 (19:58 -0400)
Booting R-Car Gen3 arm64 U-Boot with CONFIG_UBSAN=y resulted in:

 =====================================================================
 UBSAN: Undefined behaviour in drivers/net/phy/phy.c:728:19
 left shift of 1 by 31 places cannot be represented in type 'int'
 =====================================================================

Fix it by appending the UL suffix to the numeric literal. While at it,
convert the type of "addr" variable from signed to unsigned, to protect
against shifting the numeric literal by a negative value (which would
lead to yet another undefined behavior).

Fixes: 1adb406b0141 ("phy: add phy_find_by_mask/phy_connect_dev")
Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
* Using U-suffix for integer is sufficient.
* ffs() of non-zero value cannot be 0. But addr being unsigned is
* preferable.
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
drivers/net/phy/phy.c

index 63b3e46f101cefebbeb1b1e2cc05f0ae7470d3c0..f39ca942f6b315a266d632c1cb94d32715c645af 100644 (file)
@@ -642,12 +642,12 @@ static struct phy_device *search_for_existing_phy(struct mii_dev *bus,
 {
        /* If we have one, return the existing device, with new interface */
        while (phy_mask) {
-               int addr = ffs(phy_mask) - 1;
+               unsigned int addr = ffs(phy_mask) - 1;
 
                if (bus->phymap[addr])
                        return bus->phymap[addr];
 
-               phy_mask &= ~(1 << addr);
+               phy_mask &= ~(1U << addr);
        }
        return NULL;
 }