diff mbox

[RESEND,3/3] drivers/rtc/sunxi: Replace deprecated rtc_tm_to_time()

Message ID 1432911877-607-3-git-send-email-xlpang@126.com
State Superseded
Headers show

Commit Message

Xunlei Pang May 29, 2015, 3:04 p.m. UTC
From: Xunlei Pang <pang.xunlei@linaro.org>

sunxi_rtc_setalarm() uses deprecated rtc_tm_to_time(),
which will overflow in year 2106 on 32-bit machines.

This patch solves this by:
- Replacing rtc_tm_to_time() with rtc_tm_to_time64()

Also remove the unnecessary initial zeroing of some
local variables in sunxi_rtc_setalarm().

Cc: Carlo Caione <carlo.caione@gmail.com>
Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org>
---
 drivers/rtc/rtc-sunxi.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

Comments

Arnd Bergmann June 1, 2015, 7:53 p.m. UTC | #1
On Friday 29 May 2015 23:04:37 Xunlei Pang wrote:
>         }
>  
> -       rtc_tm_to_time(alrm_tm, &time_set);
> -       rtc_tm_to_time(&tm_now, &time_now);
> +       time_set = rtc_tm_to_time64(alrm_tm);
> +       time_now = rtc_tm_to_time64(&tm_now);
>         if (time_set <= time_now) {
>                 dev_err(dev, "Date to set in the past\n");
>                 return -EINVAL;
>         }
>  
> +       if (time_set > time_now + 255 * SEC_IN_DAY) {
> +               dev_err(dev, "Day must be in the range 0 - 255\n");
> +               return -EINVAL;
> +       }
> +
> 

So this driver also uses the two values just to do a comparison
and to take the difference in seconds.

If we have a helper function that returns the difference between
two rtc_tm values as a time64_t, we can use that for both
this driver and isl1208.

	Arnd
pang.xunlei@zte.com.cn June 2, 2015, 3:21 a.m. UTC | #2
Hi Arnd,

Arnd Bergmann <arnd@arndb.de> wrote 2015-06-02 AM 03:53:03:
> Re: [PATCH RESEND 3/3] drivers/rtc/sunxi: Replace deprecated 
rtc_tm_to_time()
> 
> On Friday 29 May 2015 23:04:37 Xunlei Pang wrote:
> >         }
> > 
> > -       rtc_tm_to_time(alrm_tm, &time_set);
> > -       rtc_tm_to_time(&tm_now, &time_now);
> > +       time_set = rtc_tm_to_time64(alrm_tm);
> > +       time_now = rtc_tm_to_time64(&tm_now);
> >         if (time_set <= time_now) {
> >                 dev_err(dev, "Date to set in the past\n");
> >                 return -EINVAL;
> >         }
> > 
> > +       if (time_set > time_now + 255 * SEC_IN_DAY) {
> > +               dev_err(dev, "Day must be in the range 0 - 255\n");
> > +               return -EINVAL;
> > +       }
> > +
> > 
> 
> So this driver also uses the two values just to do a comparison
> and to take the difference in seconds.
> 
> If we have a helper function that returns the difference between
> two rtc_tm values as a time64_t, we can use that for both
> this driver and isl1208.

Indeed, will do.

Thanks,
-Xunlei
--------------------------------------------------------
ZTE Information Security Notice: The information contained in this mail (and any attachment transmitted herewith) is privileged and confidential and is intended for the exclusive use of the addressee(s).  If you are not an intended recipient, any disclosure, reproduction, distribution or other dissemination or use of the information contained is strictly prohibited.  If you have received this mail in error, please delete it and notify us immediately.
diff mbox

Patch

diff --git a/drivers/rtc/rtc-sunxi.c b/drivers/rtc/rtc-sunxi.c
index 6e678fa..7f22753 100644
--- a/drivers/rtc/rtc-sunxi.c
+++ b/drivers/rtc/rtc-sunxi.c
@@ -269,14 +269,13 @@  static int sunxi_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
 	struct sunxi_rtc_dev *chip = dev_get_drvdata(dev);
 	struct rtc_time *alrm_tm = &wkalrm->time;
 	struct rtc_time tm_now;
-	u32 alrm = 0;
-	unsigned long time_now = 0;
-	unsigned long time_set = 0;
-	unsigned long time_gap = 0;
-	unsigned long time_gap_day = 0;
-	unsigned long time_gap_hour = 0;
-	unsigned long time_gap_min = 0;
-	int ret = 0;
+	u32 alrm;
+	time64_t time_set, time_now;
+	unsigned long time_gap;
+	unsigned long time_gap_day;
+	unsigned long time_gap_hour;
+	unsigned long time_gap_min;
+	int ret;
 
 	ret = sunxi_rtc_gettime(dev, &tm_now);
 	if (ret < 0) {
@@ -284,13 +283,18 @@  static int sunxi_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
 		return -EINVAL;
 	}
 
-	rtc_tm_to_time(alrm_tm, &time_set);
-	rtc_tm_to_time(&tm_now, &time_now);
+	time_set = rtc_tm_to_time64(alrm_tm);
+	time_now = rtc_tm_to_time64(&tm_now);
 	if (time_set <= time_now) {
 		dev_err(dev, "Date to set in the past\n");
 		return -EINVAL;
 	}
 
+	if (time_set > time_now + 255 * SEC_IN_DAY) {
+		dev_err(dev, "Day must be in the range 0 - 255\n");
+		return -EINVAL;
+	}
+
 	time_gap = time_set - time_now;
 	time_gap_day = time_gap / SEC_IN_DAY;
 	time_gap -= time_gap_day * SEC_IN_DAY;
@@ -299,11 +303,6 @@  static int sunxi_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
 	time_gap_min = time_gap / SEC_IN_MIN;
 	time_gap -= time_gap_min * SEC_IN_MIN;
 
-	if (time_gap_day > 255) {
-		dev_err(dev, "Day must be in the range 0 - 255\n");
-		return -EINVAL;
-	}
-
 	sunxi_rtc_setaie(0, chip);
 	writel(0, chip->base + SUNXI_ALRM_DHMS);
 	usleep_range(100, 300);