| From 27bfdcfb450d08d630df6f93f2e6e3f2d08e64f7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 6 Feb 2019 10:31:02 +0000 |
| Subject: rtc: pm8xxx: fix unintended sign extension |
| |
| From: Colin Ian King <colin.king@canonical.com> |
| |
| [ Upstream commit e42280886018c6f77f0a90190f7cba344b0df3e0 ] |
| |
| 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#1309693 ("Unintended sign extension") |
| |
| Fixes: 9a9a54ad7aa2 ("drivers/rtc: add support for Qualcomm PMIC8xxx RTC") |
| 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-pm8xxx.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c |
| index fac835530671f..a1b4b0ed1f196 100644 |
| --- a/drivers/rtc/rtc-pm8xxx.c |
| +++ b/drivers/rtc/rtc-pm8xxx.c |
| @@ -186,7 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| } |
| } |
| |
| - secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); |
| + secs = value[0] | (value[1] << 8) | (value[2] << 16) | |
| + ((unsigned long)value[3] << 24); |
| |
| rtc_time_to_tm(secs, tm); |
| |
| @@ -267,7 +268,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
| return rc; |
| } |
| |
| - secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); |
| + secs = value[0] | (value[1] << 8) | (value[2] << 16) | |
| + ((unsigned long)value[3] << 24); |
| |
| rtc_time_to_tm(secs, &alarm->time); |
| |
| -- |
| 2.20.1 |
| |