diff options
-rw-r--r-- | src/timedate/timedated.c | 19 |
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"); |