mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 17:35:06 -05:00
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:
7
util.c
7
util.c
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user