]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
conf: don't load sourcedir during initstepslew and RTC init
authorMiroslav Lichvar <mlichvar@redhat.com>
Tue, 12 Mar 2024 13:30:27 +0000 (14:30 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 12 Mar 2024 13:57:30 +0000 (14:57 +0100)
If the reload sources command was received in the chronyd start-up
sequence with initstepslew and/or RTC init (-s option), the sources
loaded from sourcedirs caused a crash due to failed assertion after
adding sources specified in the config.

Ignore the reload sources command until chronyd enters the normal
operation mode.

Fixes: 519796de3756 ("conf: add sourcedirs directive")
conf.c
test/simulation/203-initreload [new file with mode: 0755]

diff --git a/conf.c b/conf.c
index 6eae11c95de1a18ad0c7b3b1b23c3da08f9d9a4b..8849bdced87bc4fcba4c4ed52f627bf91b8bef4f 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -298,6 +298,8 @@ static ARR_Instance ntp_sources;
 static ARR_Instance ntp_source_dirs;
 /* Array of uint32_t corresponding to ntp_sources (for sourcedirs reload) */
 static ARR_Instance ntp_source_ids;
+/* Flag indicating ntp_sources and ntp_source_ids are used for sourcedirs */
+static int conf_ntp_sources_added = 0;
 
 /* Array of RefclockParameters */
 static ARR_Instance refclock_sources;
@@ -1689,8 +1691,12 @@ reload_source_dirs(void)
   NSR_Status s;
   int d, pass;
 
+  /* Ignore reload command before adding configured sources */
+  if (!conf_ntp_sources_added)
+    return;
+
   prev_size = ARR_GetSize(ntp_source_ids);
-  if (prev_size > 0 && ARR_GetSize(ntp_sources) != prev_size)
+  if (ARR_GetSize(ntp_sources) != prev_size)
     assert(0);
 
   /* Save the current sources and their configuration IDs */
@@ -1859,7 +1865,10 @@ CNF_AddSources(void)
     Free(source->params.name);
   }
 
+  /* The arrays will be used for sourcedir (re)loading */
   ARR_SetSize(ntp_sources, 0);
+  ARR_SetSize(ntp_source_ids, 0);
+  conf_ntp_sources_added = 1;
 
   reload_source_dirs();
 }
diff --git a/test/simulation/203-initreload b/test/simulation/203-initreload
new file mode 100755 (executable)
index 0000000..cf7924b
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+. ./test.common
+
+check_config_h 'FEAT_CMDMON 1' || test_skip
+
+# Test fix "conf: don't load sourcedir during initstepslew and RTC init"
+
+test_start "reload during initstepslew"
+
+client_conf="initstepslew 5 192.168.123.1
+sourcedir tmp"
+client_server_conf="#"
+chronyc_conf="reload sources"
+chronyc_start=4
+
+echo 'server 192.168.123.1' > tmp/sources.sources
+
+run_test || test_fail
+check_chronyd_exit || test_fail
+check_source_selection || test_fail
+check_sync || test_fail
+
+check_log_messages "Added source 192\.168\.123\.1" 1 1 || test_fail
+
+test_pass