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>
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;
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));