tree-wide: don't assume CLOCK_BOOTIME is generally available
Before we invoke now(CLOCK_BOOTTIME), let's make sure we actually have that clock, since now() will otherwise hit an assert. Specifically, let's refuse CLOCK_BOOTTIME early in sd-event if the kernel doesn't actually support it. This is a follow-up for #3037, and specifically: https://github.com/systemd/systemd/pull/3037#issuecomment-210199167
This commit is contained in:
@@ -1072,6 +1072,10 @@ _public_ int sd_event_add_time(
|
||||
assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
|
||||
assert_return(!event_pid_changed(e), -ECHILD);
|
||||
|
||||
if (IN_SET(clock, CLOCK_BOOTTIME, CLOCK_BOOTTIME_ALARM) &&
|
||||
!clock_boottime_supported())
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!callback)
|
||||
callback = time_exit_callback;
|
||||
|
||||
@@ -2527,7 +2531,8 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
|
||||
}
|
||||
|
||||
dual_timestamp_get(&e->timestamp);
|
||||
e->timestamp_boottime = now(clock_boottime_or_monotonic());
|
||||
if (clock_boottime_supported())
|
||||
e->timestamp_boottime = now(CLOCK_BOOTTIME);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
|
||||
@@ -2761,6 +2766,9 @@ _public_ int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec) {
|
||||
CLOCK_BOOTTIME,
|
||||
CLOCK_BOOTTIME_ALARM), -EOPNOTSUPP);
|
||||
|
||||
if (IN_SET(clock, CLOCK_BOOTTIME, CLOCK_BOOTTIME_ALARM) && !clock_boottime_supported())
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!dual_timestamp_is_set(&e->timestamp)) {
|
||||
/* Implicitly fall back to now() if we never ran
|
||||
* before and thus have no cached time. */
|
||||
|
||||
@@ -270,8 +270,10 @@ static void test_sd_event_now(void) {
|
||||
assert_se(sd_event_now(e, CLOCK_MONOTONIC, &event_now) > 0);
|
||||
assert_se(sd_event_now(e, CLOCK_REALTIME, &event_now) > 0);
|
||||
assert_se(sd_event_now(e, CLOCK_REALTIME_ALARM, &event_now) > 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME, &event_now) > 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME_ALARM, &event_now) > 0);
|
||||
if (clock_boottime_supported()) {
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME, &event_now) > 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME_ALARM, &event_now) > 0);
|
||||
}
|
||||
assert_se(sd_event_now(e, -1, &event_now) == -EOPNOTSUPP);
|
||||
assert_se(sd_event_now(e, 900 /* arbitrary big number */, &event_now) == -EOPNOTSUPP);
|
||||
|
||||
@@ -280,8 +282,10 @@ static void test_sd_event_now(void) {
|
||||
assert_se(sd_event_now(e, CLOCK_MONOTONIC, &event_now) == 0);
|
||||
assert_se(sd_event_now(e, CLOCK_REALTIME, &event_now) == 0);
|
||||
assert_se(sd_event_now(e, CLOCK_REALTIME_ALARM, &event_now) == 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME, &event_now) == 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME_ALARM, &event_now) == 0);
|
||||
if (clock_boottime_supported()) {
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME, &event_now) == 0);
|
||||
assert_se(sd_event_now(e, CLOCK_BOOTTIME_ALARM, &event_now) == 0);
|
||||
}
|
||||
assert_se(sd_event_now(e, -1, &event_now) == -EOPNOTSUPP);
|
||||
assert_se(sd_event_now(e, 900 /* arbitrary big number */, &event_now) == -EOPNOTSUPP);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user