On Mon Nov 09 2020, Colin King wrote: > From: Colin Ian King <colin.king@xxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > --- > drivers/net/dsa/hirschmann/hellcreek.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > 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; Looks good to me. Thank you. Thanks, Kurt
Attachment:
signature.asc
Description: PGP signature