From 84a87726eec88e7b11c8aa633bca006a0c0fc435 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 15 Jan 2019 02:59:48 +0900 Subject: [PATCH 1/2] timedate: treat 'activating' or 'inactivating' NTP client status as 'active' When `timedatectl set-time` is called, NTP client may be in 'activating' or something. For safety, let's treat such states as 'active'. This also changes all unit file status except for 'masked' or 'disabled' are treated as 'enabled'. --- src/timedate/timedated.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index e16888945c..12308bed42 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -160,7 +160,7 @@ static int context_ntp_service_is_active(Context *c) { /* Call context_update_ntp_status() to update UnitStatusInfo before calling this. */ LIST_FOREACH(units, info, c->units) - count += streq_ptr(info->active_state, "active"); + count += !STRPTR_IN_SET(info->active_state, "inactive", "failed"); return count; } @@ -174,7 +174,7 @@ static int context_ntp_service_is_enabled(Context *c) { /* Call context_update_ntp_status() to update UnitStatusInfo before calling this. */ LIST_FOREACH(units, info, c->units) - count += STRPTR_IN_SET(info->unit_file_state, "enabled", "enabled-runtime"); + count += !STRPTR_IN_SET(info->unit_file_state, "masked", "masked-runtime", "disabled", "bad"); return count; } From b4356b5720ae0974f1f8962e26562591dd0be9e9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 15 Jan 2019 14:51:30 +0900 Subject: [PATCH 2/2] timedate: refuse to set time when previous request is not finished If `timedatectl set-time` is invoked right after `timedatectl set-ntp true`, then, the NTP service may not be started yet. Fixes #11420. --- src/timedate/timedated.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 12308bed42..eeb17b613e 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -523,6 +523,10 @@ static int property_get_can_ntp( assert(reply); assert(error); + if (c->slot_job_removed) + /* When the previous request is not finished, then assume NTP is enabled. */ + return sd_bus_message_append(reply, "b", true); + r = context_update_ntp_status(c, bus, reply); if (r < 0) return r; @@ -548,6 +552,10 @@ static int property_get_ntp( assert(reply); assert(error); + if (c->slot_job_removed) + /* When the previous request is not finished, then assume NTP is active. */ + return sd_bus_message_append(reply, "b", true); + r = context_update_ntp_status(c, bus, reply); if (r < 0) return r; @@ -735,6 +743,9 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro assert(m); assert(c); + if (c->slot_job_removed) + return sd_bus_error_set(error, BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED, "Previous request is not finished, refusing."); + r = context_update_ntp_status(c, bus, m); if (r < 0) return sd_bus_error_set_errnof(error, r, "Failed to update context: %m");