[PATCH][next][V2] rtc: msc313: Fix unintentional sign extension issues with left shift of a u16

Subsystems: arm/mstar/sigmastar armv7 soc support, real time clock (rtc) subsystem, the rest

STALE1813d LANDED

Landed in mainline as f3606687b447 on 2021-10-01.

3 messages, 3 authors, 2021-10-01 · open the first message on its own page

[PATCH][next][V2] rtc: msc313: Fix unintentional sign extension issues with left shift of a u16

From: Colin King <hidden>
Date: 2021-09-28 13:47:02

From: Colin Ian King <redacted>

Shifting the u16 value returned by readw by 16 bits to the left
will be promoted to a 32 bit signed int and then sign-extended
to an unsigned long. If the top bit of the readw is set then
the shifted value will be sign extended and the top 32 bits of
the result will be set.

Fixes: be7d9c9161b9 ("rtc: Add support for the MSTAR MSC313 RTC")
Signed-off-by: Colin Ian King <redacted>
---
V2: Fix identical issue in msc313_rtc_read_time too. Thanks to Daniel Palmer
    for noticing this ommission.
---
 drivers/rtc/rtc-msc313.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/rtc-msc313.c b/drivers/rtc/rtc-msc313.c
index 5f178d29cfd8..f3fde013c4b8 100644
--- a/drivers/rtc/rtc-msc313.c
+++ b/drivers/rtc/rtc-msc313.c
@@ -53,7 +53,7 @@ static int msc313_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 	unsigned long seconds;
 
 	seconds = readw(priv->rtc_base + REG_RTC_MATCH_VAL_L)
-			| (readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);
+			| ((unsigned long)readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);
 
 	rtc_time64_to_tm(seconds, &alarm->time);
 
@@ -122,7 +122,7 @@ static int msc313_rtc_read_time(struct device *dev, struct rtc_time *tm)
 		udelay(1);
 
 	seconds = readw(priv->rtc_base + REG_RTC_CNT_VAL_L)
-			| (readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);
+			| ((unsigned long)readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);
 
 	rtc_time64_to_tm(seconds, tm);
 
-- 
2.32.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH][next][V2] rtc: msc313: Fix unintentional sign extension issues with left shift of a u16

From: Romain Perier <romain.perier@gmail.com>
Date: 2021-09-28 17:36:14

Hi,


Re-tested with rtctest and rtc-range, everything passed.



Le mar. 28 sept. 2021 à 15:46, Colin King [off-list ref] a écrit :
From: Colin Ian King <redacted>

Shifting the u16 value returned by readw by 16 bits to the left
will be promoted to a 32 bit signed int and then sign-extended
to an unsigned long. If the top bit of the readw is set then
the shifted value will be sign extended and the top 32 bits of
the result will be set.

Fixes: be7d9c9161b9 ("rtc: Add support for the MSTAR MSC313 RTC")
Signed-off-by: Colin Ian King <redacted>
Reviewed-by: Romain Perier <romain.perier@gmail.com>

Thanks,
Romain
quoted hunk
---
V2: Fix identical issue in msc313_rtc_read_time too. Thanks to Daniel Palmer
    for noticing this ommission.
---
 drivers/rtc/rtc-msc313.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/rtc/rtc-msc313.c b/drivers/rtc/rtc-msc313.c
index 5f178d29cfd8..f3fde013c4b8 100644
--- a/drivers/rtc/rtc-msc313.c
+++ b/drivers/rtc/rtc-msc313.c
@@ -53,7 +53,7 @@ static int msc313_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
        unsigned long seconds;

        seconds = readw(priv->rtc_base + REG_RTC_MATCH_VAL_L)
-                       | (readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);
+                       | ((unsigned long)readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);

        rtc_time64_to_tm(seconds, &alarm->time);
@@ -122,7 +122,7 @@ static int msc313_rtc_read_time(struct device *dev, struct rtc_time *tm)
                udelay(1);

        seconds = readw(priv->rtc_base + REG_RTC_CNT_VAL_L)
-                       | (readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);
+                       | ((unsigned long)readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);

        rtc_time64_to_tm(seconds, tm);

--
2.32.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH][next][V2] rtc: msc313: Fix unintentional sign extension issues with left shift of a u16

From: Alexandre Belloni <alexandre.belloni@bootlin.com>
Date: 2021-10-01 21:29:48

On Tue, 28 Sep 2021 14:46:54 +0100, Colin King wrote:
From: Colin Ian King <redacted>

Shifting the u16 value returned by readw by 16 bits to the left
will be promoted to a 32 bit signed int and then sign-extended
to an unsigned long. If the top bit of the readw is set then
the shifted value will be sign extended and the top 32 bits of
the result will be set.

[...]
Applied, thanks!

[1/1] rtc: msc313: Fix unintentional sign extension issues with left shift of a u16
      commit: f3606687b447c41d28a011c98373b62b1cd52345

Best regards,
-- 
Alexandre Belloni [off-list ref]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help