Skip to content

Commit e8ba8a2

Browse files
Yongliang Gaoalexandrebelloni
authored andcommitted
rtc: check if __rtc_read_time was successful in rtc_timer_do_work()
If the __rtc_read_time call fails,, the struct rtc_time tm; may contain uninitialized data, or an illegal date/time read from the RTC hardware. When calling rtc_tm_to_ktime later, the result may be a very large value (possibly KTIME_MAX). If there are periodic timers in rtc->timerqueue, they will continually expire, may causing kernel softlockup. Fixes: 6610e08 ("RTC: Rework RTC code to use timerqueue for events") Signed-off-by: Yongliang Gao <[email protected]> Acked-by: Jingqun Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexandre Belloni <[email protected]>
1 parent 00f1bb9 commit e8ba8a2

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/rtc/interface.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,13 +904,18 @@ void rtc_timer_do_work(struct work_struct *work)
904904
struct timerqueue_node *next;
905905
ktime_t now;
906906
struct rtc_time tm;
907+
int err;
907908

908909
struct rtc_device *rtc =
909910
container_of(work, struct rtc_device, irqwork);
910911

911912
mutex_lock(&rtc->ops_lock);
912913
again:
913-
__rtc_read_time(rtc, &tm);
914+
err = __rtc_read_time(rtc, &tm);
915+
if (err) {
916+
mutex_unlock(&rtc->ops_lock);
917+
return;
918+
}
914919
now = rtc_tm_to_ktime(tm);
915920
while ((next = timerqueue_getnext(&rtc->timerqueue))) {
916921
if (next->expires > now)

0 commit comments

Comments
 (0)