OSDN Git Service

ipmi_si: fix potential integer overflow on large shift
authorColin Ian King <colin.king@canonical.com>
Tue, 5 Jun 2018 16:51:07 +0000 (17:51 +0100)
committerCorey Minyard <cminyard@mvista.com>
Tue, 18 Sep 2018 21:15:33 +0000 (16:15 -0500)
Shifting unsigned char b by an int type can lead to sign-extension
overflow. For example, if b is 0xff and the shift is 24, then top
bit is sign-extended so the final value passed to writeq has all
the upper 32 bits set.  Fix this by casting b to a 64 bit unsigned
before the shift.

Detected by CoverityScan, CID#1465246 ("Unintended sign extension")

Signed-off-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_si_mem_io.c

index 1b869d5..fd0ec8d 100644 (file)
@@ -51,7 +51,7 @@ static unsigned char mem_inq(const struct si_sm_io *io, unsigned int offset)
 static void mem_outq(const struct si_sm_io *io, unsigned int offset,
                     unsigned char b)
 {
-       writeq(b << io->regshift, (io->addr)+(offset * io->regspacing));
+       writeq((u64)b << io->regshift, (io->addr)+(offset * io->regspacing));
 }
 #endif