| From stable-bounces@linux.kernel.org Tue May 13 12:10:24 2008 |
| From: Maciej W. Rozycki <macro@linux-mips.org> |
| Date: Tue, 13 May 2008 19:10:10 GMT |
| Subject: rtc: rtc_time_to_tm: use unsigned arithmetic |
| To: jejb@kernel.org, stable@kernel.org |
| Message-ID: <200805131910.m4DJAAWD007525@hera.kernel.org> |
| |
| From: Maciej W. Rozycki <macro@linux-mips.org> |
| |
| commit 945185a69daa457c4c5e46e47f4afad7dcea734f upstream |
| Date: Mon, 12 May 2008 14:02:24 -0700 |
| Subject: rtc: rtc_time_to_tm: use unsigned arithmetic |
| |
| The input argument to rtc_time_to_tm() is unsigned as well as are members of |
| the output structure. However signed arithmetic is used within for |
| calculations leading to incorrect results for input values outside the signed |
| positive range. If this happens the time of day returned is out of range. |
| |
| Found the problem when fiddling with the RTC and the driver where year was set |
| to an unexpectedly large value like 2070, e.g.: |
| |
| rtc0: setting system clock to 2070-01-01 1193046:71582832:26 UTC (3155760954) |
| |
| while it should be: |
| |
| rtc0: setting system clock to 2070-01-01 00:15:54 UTC (3155760954) |
| |
| Changing types to unsigned fixes the problem. |
| |
| [akpm@linux-foundation.org: remove old-fashioned `register' keyword] |
| Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> |
| Cc: Alessandro Zummo <a.zummo@towertech.it> |
| Cc: David Brownell <david-b@pacbell.net> |
| Cc: Dmitri Vorobiev <dmitri.vorobiev@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/rtc/rtc-lib.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/rtc/rtc-lib.c |
| +++ b/drivers/rtc/rtc-lib.c |
| @@ -51,7 +51,7 @@ EXPORT_SYMBOL(rtc_year_days); |
| */ |
| void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) |
| { |
| - register int days, month, year; |
| + unsigned int days, month, year; |
| |
| days = time / 86400; |
| time -= days * 86400; |