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 <eric.sesterhenn@x41-dsec.de>
This commit is contained in:
Miroslav Lichvar
2025-07-02 15:34:03 +02:00
parent d30913e78c
commit 1d9e080749

7
util.c
View File

@@ -1364,6 +1364,7 @@ FILE *
UTI_OpenFile(const char *basedir, const char *name, const char *suffix, UTI_OpenFile(const char *basedir, const char *name, const char *suffix,
char mode, mode_t perm) char mode, mode_t perm)
{ {
uint64_t attempts = 0, warn_attempts = 100;
const char *file_mode; const char *file_mode;
char path[PATH_MAX]; char path[PATH_MAX];
LOG_Severity severity; LOG_Severity severity;
@@ -1407,6 +1408,12 @@ try_again:
return NULL; return NULL;
} }
DEBUG_LOG("Removed %s", path); 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; goto try_again;
} }
LOG(severity, "Could not open %s : %s", path, strerror(errno)); LOG(severity, "Could not open %s : %s", path, strerror(errno));