| From dde2bc482f5be4e1f382e9959828045c186e0297 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 5 Feb 2019 18:04:49 +0000 |
| Subject: rtc: ds1672: fix unintended sign extension |
| |
| From: Colin Ian King <colin.king@canonical.com> |
| |
| [ Upstream commit f0c04c276739ed8acbb41b4868e942a55b128dca ] |
| |
| Shifting a u8 by 24 will cause the value to be promoted to an integer. If |
| the top bit of the u8 is set then the following conversion to an unsigned |
| long will sign extend the value causing the upper 32 bits to be set in |
| the result. |
| |
| Fix this by casting the u8 value to an unsigned long before the shift. |
| |
| Detected by CoverityScan, CID#138801 ("Unintended sign extension") |
| |
| Fixes: edf1aaa31fc5 ("[PATCH] RTC subsystem: DS1672 driver") |
| Signed-off-by: Colin Ian King <colin.king@canonical.com> |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/rtc/rtc-ds1672.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c |
| index 5c18ac7394c42..c911f2db0af5e 100644 |
| --- a/drivers/rtc/rtc-ds1672.c |
| +++ b/drivers/rtc/rtc-ds1672.c |
| @@ -58,7 +58,8 @@ static int ds1672_get_datetime(struct i2c_client *client, struct rtc_time *tm) |
| "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", |
| __func__, buf[0], buf[1], buf[2], buf[3]); |
| |
| - time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; |
| + time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | |
| + (buf[1] << 8) | buf[0]; |
| |
| rtc_time_to_tm(time, tm); |
| |
| -- |
| 2.20.1 |
| |