| From 454f47ff464325223129b9b5b8d0b61946ec704d Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Mateusz=20Jo=C5=84czyk?= <mat.jonczyk@o2.pl> |
| Date: Fri, 10 Dec 2021 21:01:23 +0100 |
| Subject: rtc: cmos: take rtc_lock while reading from CMOS |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Mateusz Jończyk <mat.jonczyk@o2.pl> |
| |
| commit 454f47ff464325223129b9b5b8d0b61946ec704d upstream. |
| |
| Reading from the CMOS involves writing to the index register and then |
| reading from the data register. Therefore access to the CMOS has to be |
| serialized with rtc_lock. This invocation of CMOS_READ was not |
| serialized, which could cause trouble when other code is accessing CMOS |
| at the same time. |
| |
| Use spin_lock_irq() like the rest of the function. |
| |
| Nothing in kernel modifies the RTC_DM_BINARY bit, so there could be a |
| separate pair of spin_lock_irq() / spin_unlock_irq() before doing the |
| math. |
| |
| Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl> |
| Reviewed-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org> |
| Cc: Alessandro Zummo <a.zummo@towertech.it> |
| Cc: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Link: https://lore.kernel.org/r/20211210200131.153887-2-mat.jonczyk@o2.pl |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/rtc/rtc-cmos.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/rtc/rtc-cmos.c |
| +++ b/drivers/rtc/rtc-cmos.c |
| @@ -457,7 +457,10 @@ static int cmos_set_alarm(struct device |
| min = t->time.tm_min; |
| sec = t->time.tm_sec; |
| |
| + spin_lock_irq(&rtc_lock); |
| rtc_control = CMOS_READ(RTC_CONTROL); |
| + spin_unlock_irq(&rtc_lock); |
| + |
| if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { |
| /* Writing 0xff means "don't care" or "match all". */ |
| mon = (mon <= 12) ? bin2bcd(mon) : 0xff; |