diff options
author | Mike Waychison <mikew@google.com> | 2011-08-12 23:04:30 +0200 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2011-08-27 02:26:35 +0200 |
commit | a7402deb324f62106566f5a95199a54c41e200ef (patch) | |
tree | 0eafe76a936eaa9f5391988d2a0021b3d0907dbb /drivers/rtc/rtc-lib.c | |
parent | rtc: Fix RTC PIE frequency limit (diff) | |
download | linux-a7402deb324f62106566f5a95199a54c41e200ef.tar.xz linux-a7402deb324f62106566f5a95199a54c41e200ef.zip |
rtc: Initialized rtc_time->tm_isdst
Even though the Linux kernel does not use the tm_isdst field, it is
exposed as part of the ABI. This field can accidentally be left
initialized, which is why we currently memset buffers returned to
userland in rtc_read_time.
There is a case however where the field can return garbage from the
stack though when using the RTC_ALM_READ ioctl on the rtc device. This
ioctl invokes rtc_read_alarm, which is careful to memset the rtc_wkalrm
buffer that is copied to userland, but it then uses a struct copy to
assign to alarm->time given the return value from rtc_ktime_to_tm().
rtc_ktime_to_tm() is implemented by calling rtc_time_to_tm using a
derivative seconds counds from ktime, but rtc_time_to_tm does not assign
a value to ->tm_isdst. This results in garbage from rtc_ktime_to_tm()'s
frame ending up being copied out to userland as part of the returned
rtc_wkalrm.
Fix this by initializing rtc_time->tm_isdst to 0 in rtc_time_to_tm.
Signed-off-by: Mike Waychison <mikew@google.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'drivers/rtc/rtc-lib.c')
-rw-r--r-- | drivers/rtc/rtc-lib.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c index 075f1708deae..c4cf05731118 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/rtc-lib.c @@ -85,6 +85,8 @@ void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) time -= tm->tm_hour * 3600; tm->tm_min = time / 60; tm->tm_sec = time - tm->tm_min * 60; + + tm->tm_isdst = 0; } EXPORT_SYMBOL(rtc_time_to_tm); |