From 1d9e080749d1c705263fb88438b889213689dccc Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 2 Jul 2025 15:34:03 +0200 Subject: [PATCH] util: warn if UTI_OpenFile() is stuck in a loop When UTI_OpenFile() is removing an existing file to be replaced by a new file, it could potentially get stuck in an infinite loop if something was able to consistently win the race and create a new file before chronyd. Log a warning message after 100 failed attempts and repeat on each 10x increase to make it more obvious to the admin, if it ever happens. Reported-by: Eric Sesterhenn --- util.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/util.c b/util.c index 26eaa35f..837330b2 100644 --- a/util.c +++ b/util.c @@ -1364,6 +1364,7 @@ FILE * UTI_OpenFile(const char *basedir, const char *name, const char *suffix, char mode, mode_t perm) { + uint64_t attempts = 0, warn_attempts = 100; const char *file_mode; char path[PATH_MAX]; LOG_Severity severity; @@ -1407,6 +1408,12 @@ try_again: return NULL; } DEBUG_LOG("Removed %s", path); + + if (++attempts == warn_attempts) { + LOG(LOGS_WARN, "Failing to replace %s (%"PRIu64" attempts)", path, attempts); + warn_attempts *= 10; + } + goto try_again; } LOG(severity, "Could not open %s : %s", path, strerror(errno)); -- 2.39.5