You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
From 52df8972d4005b23f7c2e52b0cf7210b8c594876 Mon Sep 17 00:00:00 2001 |
|
From: Lennart Poettering <lennart@poettering.net> |
|
Date: Mon, 25 Jun 2018 14:29:25 +0200 |
|
Subject: [PATCH] timedate: use gmtime_r() and localtime_r() |
|
|
|
gmtime() and localtime() operate on a static buffer. let's avoid this, |
|
as we never know whether some library might use these calls in some |
|
backrgound thread. |
|
|
|
Discovered by lgtm: |
|
|
|
https://lgtm.com/projects/g/systemd/systemd/ |
|
(cherry picked from commit e46acb7950a9f07ac60d772309de842c444ad2bd) |
|
|
|
Resolves: #1694605 |
|
--- |
|
src/timedate/timedated.c | 20 ++++++++++---------- |
|
1 file changed, 10 insertions(+), 10 deletions(-) |
|
|
|
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c |
|
index 09d0dbabcd..afd54a8936 100644 |
|
--- a/src/timedate/timedated.c |
|
+++ b/src/timedate/timedated.c |
|
@@ -542,9 +542,9 @@ static int method_set_local_rtc(sd_bus *bus, sd_bus_message *m, void *userdata, |
|
* initialize the timezone fields of |
|
* struct tm. */ |
|
if (c->local_rtc) |
|
- tm = *localtime(&ts.tv_sec); |
|
+ localtime_r(&ts.tv_sec, &tm); |
|
else |
|
- tm = *gmtime(&ts.tv_sec); |
|
+ gmtime_r(&ts.tv_sec, &tm); |
|
|
|
/* Override the main fields of |
|
* struct tm, but not the timezone |
|
@@ -562,15 +562,15 @@ static int method_set_local_rtc(sd_bus *bus, sd_bus_message *m, void *userdata, |
|
} |
|
|
|
} else { |
|
- struct tm *tm; |
|
+ struct tm tm; |
|
|
|
/* Sync RTC from system clock */ |
|
if (c->local_rtc) |
|
- tm = localtime(&ts.tv_sec); |
|
+ localtime_r(&ts.tv_sec, &tm); |
|
else |
|
- tm = gmtime(&ts.tv_sec); |
|
+ gmtime_r(&ts.tv_sec, &tm); |
|
|
|
- clock_set_hwclock(tm); |
|
+ clock_set_hwclock(&tm); |
|
} |
|
|
|
log_info("RTC configured to %s time.", c->local_rtc ? "local" : "UTC"); |
|
@@ -585,7 +585,7 @@ static int method_set_time(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu |
|
Context *c = userdata; |
|
int64_t utc; |
|
struct timespec ts; |
|
- struct tm* tm; |
|
+ struct tm tm; |
|
int r; |
|
|
|
assert(bus); |
|
@@ -633,10 +633,10 @@ static int method_set_time(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu |
|
|
|
/* Sync down to RTC */ |
|
if (c->local_rtc) |
|
- tm = localtime(&ts.tv_sec); |
|
+ localtime_r(&ts.tv_sec, &tm); |
|
else |
|
- tm = gmtime(&ts.tv_sec); |
|
- clock_set_hwclock(tm); |
|
+ gmtime_r(&ts.tv_sec, &tm); |
|
+ clock_set_hwclock(&tm); |
|
|
|
log_struct(LOG_INFO, |
|
LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
|
|
|