rtc: cmos: zero-init wkalrm when reading from CMOS
cmos_read_alarm() may leave certain fields of a struct rtc_wkalrm untouched; therefore, these fields contain garbage if not properly initialized, leading to inconsistent values when converting into time64_t. This patch to zero initialize the struct before calling cmos_read_alarm(). Note that this patch is not intended to produce a correct time64_t, it is only to produce a consistent value. In the case of suspend/resume, a correct time64_t is not necessary; a consistent value is sufficient to correctly perform an equality test for t_current_expires and t_saved_expires. Logic to deduce a correct time64_t is expensive and hence should be avoided. Signed-off-by: Victor Ding <victording@google.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20200814191654.v2.1.Iaf7638a2f2a87ff68d85fcb8dec615e41340c97f@changeid
This commit is contained in:
parent
9123e3a74e
commit
c254bcd723
@ -1006,6 +1006,7 @@ static int cmos_suspend(struct device *dev)
|
||||
enable_irq_wake(cmos->irq);
|
||||
}
|
||||
|
||||
memset(&cmos->saved_wkalrm, 0, sizeof(struct rtc_wkalrm));
|
||||
cmos_read_alarm(dev, &cmos->saved_wkalrm);
|
||||
|
||||
dev_dbg(dev, "suspend%s, ctrl %02x\n",
|
||||
@ -1054,6 +1055,7 @@ static void cmos_check_wkalrm(struct device *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
memset(¤t_alarm, 0, sizeof(struct rtc_wkalrm));
|
||||
cmos_read_alarm(dev, ¤t_alarm);
|
||||
t_current_expires = rtc_tm_to_time64(¤t_alarm.time);
|
||||
t_saved_expires = rtc_tm_to_time64(&cmos->saved_wkalrm.time);
|
||||
|
Loading…
Reference in New Issue
Block a user