| From 8f8ef5730688a740a9afae2e2a881031cd4824c4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Jun 2021 16:17:27 +0100 |
| Subject: scsi: aic7xxx: Fix unintentional sign extension issue on left shift |
| of u8 |
| |
| From: Colin Ian King <colin.king@canonical.com> |
| |
| [ Upstream commit 332a9dd1d86f1e7203fc7f0fd7e82f0b304200fe ] |
| |
| The shifting of the u8 integer returned fom ahc_inb(ahc, port+3) by 24 bits |
| to the left will be promoted to a 32 bit signed int and then sign-extended |
| to a u64. In the event that the top bit of the u8 is set then all then all |
| the upper 32 bits of the u64 end up as also being set because of the |
| sign-extension. Fix this by casting the u8 values to a u64 before the 24 |
| bit left shift. |
| |
| [ This dates back to 2002, I found the offending commit from the git |
| history git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git, |
| commit f58eb66c0b0a ("Update aic7xxx driver to 6.2.10...") ] |
| |
| Link: https://lore.kernel.org/r/20210621151727.20667-1-colin.king@canonical.com |
| Signed-off-by: Colin Ian King <colin.king@canonical.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Addresses-Coverity: ("Unintended sign extension") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/aic7xxx/aic7xxx_core.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c |
| index 725bb7f58054..12fed15dec66 100644 |
| --- a/drivers/scsi/aic7xxx/aic7xxx_core.c |
| +++ b/drivers/scsi/aic7xxx/aic7xxx_core.c |
| @@ -493,7 +493,7 @@ ahc_inq(struct ahc_softc *ahc, u_int port) |
| return ((ahc_inb(ahc, port)) |
| | (ahc_inb(ahc, port+1) << 8) |
| | (ahc_inb(ahc, port+2) << 16) |
| - | (ahc_inb(ahc, port+3) << 24) |
| + | (((uint64_t)ahc_inb(ahc, port+3)) << 24) |
| | (((uint64_t)ahc_inb(ahc, port+4)) << 32) |
| | (((uint64_t)ahc_inb(ahc, port+5)) << 40) |
| | (((uint64_t)ahc_inb(ahc, port+6)) << 48) |
| -- |
| 2.30.2 |
| |