Hi,

sending a small patch for NTPD client applet. The issue is that time
synchronization may completely fail if DNS resolution is not working
properly when the NTPD service is started.

Discovered on dumb APs running OpenWrt 24.10 with BusyBox 1.36.1.
Changes were tested on Ubuntu 20.04.

My assumption is that libresolv is available on all supported platforms.
If that's not the case, let me know (or add some config flag for it
yourself).

David


-- >8 --

From d8c6c48ca863aa5ac7dc947ad1be531c388e3107 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?D=C3=A1vid=20Benko?= <[email protected]>
Date: Sun, 24 Aug 2025 22:21:01 +0200
Subject: [PATCH] ntpd: reload resolv.conf file when DNS resolution fails
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When NTPD is started with peers identified by hostnames while no DNS
server is configured in resolv.conf file, no NTP synchronization is
ever carried out as DNS resolution fails indefinitely, even when
resolv.conf changes.

This is especially problematic on devices with local DNS server
(e.g. dnsmasq) disabled and just DHCP client upstream interface(s) -
for example dumb APs. During boot process, ntpd service may start
sooner than DHCP address allocation is finished and DNS servers are
set up causing complete time synchronization failure.

Proposed solution is simple - just reload resolv.conf file in each
consecutive DNS resolution attempt.

Signed-off-by: Dávid Benko <[email protected]>
---
 Makefile.flags    |  4 +++-
 networking/ntpd.c | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/Makefile.flags b/Makefile.flags
index 97cb4dca2..b90dfca84 100644
--- a/Makefile.flags
+++ b/Makefile.flags
@@ -184,7 +184,9 @@ CPPFLAGS += $(SELINUX_CFLAGS)
 LDLIBS += $(if 
$(SELINUX_LIBS),$(SELINUX_LIBS:-l%=%),$(SELINUX_PC_MODULES:lib%=%))
 endif
 
-ifeq ($(CONFIG_FEATURE_NSLOOKUP_BIG),y)
+ifeq ($(CONFIG_NTPD),y)
+LDLIBS += resolv
+else ifeq ($(CONFIG_FEATURE_NSLOOKUP_BIG),y)
 ifneq (,$(findstring linux,$(shell $(CC) $(CFLAGS) -dumpmachine)))
 LDLIBS += resolv
 endif
diff --git a/networking/ntpd.c b/networking/ntpd.c
index dd0a9c91f..c15eb3004 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -108,6 +108,7 @@
 #include "libbb.h"
 #include <math.h>
 #include <netinet/ip.h> /* For IPTOS_DSCP_AF21 definition */
+#include <resolv.h>
 #include <sys/timex.h>
 #ifndef IPTOS_DSCP_AF21
 # define IPTOS_DSCP_AF21 0x48
@@ -2591,6 +2592,7 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                if (nfds <= 0) {
                        double ct;
                        int dns_error;
+                       bool resolv_reloaded = false;
 
                        if (bb_got_signal)
                                break; /* poll was interrupted by a signal */
@@ -2611,6 +2613,23 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                        for (item = G.ntp_peers; item != NULL; item = 
item->link) {
                                peer_t *p = (peer_t *) item->data;
                                if (p->next_action_time <= ct && !p->p_lsa) {
+                                       /* Reload resolv.conf file
+                                        * DNS resolution may be failing due to 
missing definitions
+                                        * of DNS servers. This is especially 
problematic
+                                        * on devices with local DNS server 
(e.g. dnsmasq) disabled
+                                        * and just DHCP client upstream 
interface(s) - for example
+                                        * dumb APs. During boot process, ntpd 
service may start
+                                        * sooner than DHCP address allocation 
is finished and DNS
+                                        * servers are set up causing complete 
time synchronization
+                                        * failure.
+                                        * resolv_reloaded flag ensures reload 
is performed only
+                                        * once for all unresolved peers in one 
resolution cycle.
+                                        */
+                                       if (!resolv_reloaded) {
+                                               res_init();
+                                               resolv_reloaded = true;
+                                       }
+
                                        /* This can take up to ~10 sec per each 
DNS query */
                                        dns_error |= 
(!resolve_peer_hostname(p));
                                }
-- 
2.25.1
_______________________________________________
busybox mailing list
[email protected]
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to