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.
51 lines
2.0 KiB
51 lines
2.0 KiB
4 years ago
|
From 016f8f9305a5584d718579f90ee537398dfed33b Mon Sep 17 00:00:00 2001
|
||
|
From: Lennart Poettering <lennart@poettering.net>
|
||
|
Date: Thu, 14 Sep 2017 18:26:10 +0200
|
||
|
Subject: [PATCH] timer: don't use persietent file timestamps from the future
|
||
|
(#6823)
|
||
|
|
||
|
Also, use the mtime rather than the atime of the timestamp file. While
|
||
|
the atime is not completely wrong, the mtime appears more appropriate
|
||
|
as that's what we actually explicitly change, and is not effected by
|
||
|
mere reading.
|
||
|
|
||
|
Fixes: #6821
|
||
|
(cherry picked from commit 77542a7905520f1d637912bf47bddb4855506e41)
|
||
|
|
||
|
Resolves: #1769923
|
||
|
---
|
||
|
src/core/timer.c | 20 +++++++++++++++++---
|
||
|
1 file changed, 17 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/src/core/timer.c b/src/core/timer.c
|
||
|
index 1d4868643a..fb192d558a 100644
|
||
|
--- a/src/core/timer.c
|
||
|
+++ b/src/core/timer.c
|
||
|
@@ -595,9 +595,23 @@ static int timer_start(Unit *u) {
|
||
|
if (t->stamp_path) {
|
||
|
struct stat st;
|
||
|
|
||
|
- if (stat(t->stamp_path, &st) >= 0)
|
||
|
- t->last_trigger.realtime = timespec_load(&st.st_atim);
|
||
|
- else if (errno == ENOENT)
|
||
|
+ if (stat(t->stamp_path, &st) >= 0) {
|
||
|
+ usec_t ft;
|
||
|
+
|
||
|
+ /* Load the file timestamp, but only if it is actually in the past. If it is in the future,
|
||
|
+ * something is wrong with the system clock. */
|
||
|
+
|
||
|
+ ft = timespec_load(&st.st_mtim);
|
||
|
+ if (ft < now(CLOCK_REALTIME))
|
||
|
+ t->last_trigger.realtime = ft;
|
||
|
+ else {
|
||
|
+ char z[FORMAT_TIMESTAMP_MAX];
|
||
|
+
|
||
|
+ log_unit_warning(u->id, "%s not using persistent file timestamp %s as it is in the future.",
|
||
|
+ u->id, format_timestamp(z, sizeof(z), ft));
|
||
|
+ }
|
||
|
+
|
||
|
+ } else if (errno == ENOENT)
|
||
|
/* The timer has never run before,
|
||
|
* make sure a stamp file exists.
|
||
|
*/
|