Message ID | 20201109124008.2079873-1-colin.king@canonical.com |
---|---|
State | New |
Headers | show |
Series | [next] net: dsa: fix unintended sign extension on a u16 left shift | expand |
On Mon, 09 Nov 2020 14:27:52 +0100 Kurt Kanzenbach wrote: > On Mon Nov 09 2020, Colin King wrote: > > From: Colin Ian King <colin.king@canonical.com> > > > > The left shift of u16 variable high is promoted to the type int and > > then sign extended to a 64 bit u64 value. If the top bit of high is > > set then the upper 32 bits of the result end up being set by the > > sign extension. Fix this by explicitly casting the value in high to > > a u64 before left shifting by 16 places. > > > > Also, remove the initialisation of variable value to 0 at the start > > of each loop iteration as the value is never read and hence the > > assignment it is redundant. > > > > Addresses-Coverity: ("Unintended sign extension") > > Fixes: e4b27ebc780f ("net: dsa: Add DSA driver for Hirschmann Hellcreek switches") > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > > Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de> Applied, thanks!
diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c index dfa66f7260d6..d42f40c76ba5 100644 --- a/drivers/net/dsa/hirschmann/hellcreek.c +++ b/drivers/net/dsa/hirschmann/hellcreek.c @@ -308,7 +308,7 @@ static void hellcreek_get_ethtool_stats(struct dsa_switch *ds, int port, const struct hellcreek_counter *counter = &hellcreek_counter[i]; u8 offset = counter->offset + port * 64; u16 high, low; - u64 value = 0; + u64 value; mutex_lock(&hellcreek->reg_lock); @@ -320,7 +320,7 @@ static void hellcreek_get_ethtool_stats(struct dsa_switch *ds, int port, */ high = hellcreek_read(hellcreek, HR_CRDH); low = hellcreek_read(hellcreek, HR_CRDL); - value = (high << 16) | low; + value = ((u64)high << 16) | low; hellcreek_port->counter_values[i] += value; data[i] = hellcreek_port->counter_values[i];