summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/timedate/timedated.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c
index 85506f4fc6..16fffd0844 100644
--- a/src/timedate/timedated.c
+++ b/src/timedate/timedated.c
@@ -816,15 +816,24 @@ static DBusHandlerResult timedate_message_handler(
struct timespec ts;
struct tm* tm;
+ if (relative) {
+ usec_t n, x;
+
+ n = now(CLOCK_REALTIME);
+ x = n + utc;
+
+ if ((utc > 0 && x < n) ||
+ (utc < 0 && x > n))
+ return bus_send_error_reply(connection, message, NULL, -EOVERFLOW);
+
+ timespec_store(&ts, x);
+ } else
+ timespec_store(&ts, (usec_t) utc);
+
r = verify_polkit(connection, message, "org.freedesktop.timedate1.set-time", interactive, NULL, &error);
if (r < 0)
return bus_send_error_reply(connection, message, &error, r);
- if (relative)
- timespec_store(&ts, now(CLOCK_REALTIME) + utc);
- else
- timespec_store(&ts, utc);
-
/* Set system clock */
if (clock_settime(CLOCK_REALTIME, &ts) < 0) {
log_error("Failed to set local time: %m");