From 4967b25b95d839bff71d63d2b1544de026391fef Mon Sep 17 00:00:00 2001 From: Collin Date: Thu, 26 Jun 2025 19:34:54 -0500 Subject: [PATCH] Update log.c to Solve High CodeQL alert Time-of-check time-of-use filesystem race condition Fixes a bug found in how log files worked. Feel free to make any changes. --- os/log.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/os/log.c b/os/log.c index 60837b10d..09bad3289 100644 --- a/os/log.c +++ b/os/log.c @@ -178,24 +178,27 @@ LogFilePrep(const char *fname, const char *backup, const char *idstring) if (asprintf(&logFileName, fname, idstring) == -1) FatalError("Cannot allocate space for the log file name\n"); - if (backup && *backup) { - struct stat buf; + int fd = open(logFileName, O_RDWR | O_NOFOLLOW);Add commentMore actions + if (fd != -1) { + struct stat buf; + if (fstat(fd, &buf) == 0 && S_ISREG(buf.st_mode)) { + char *suffix; + char *oldLog; - if (!stat(logFileName, &buf) && S_ISREG(buf.st_mode)) { - char *suffix; - char *oldLog; + if ((asprintf(&suffix, backup, idstring) == -1) || + (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1)) { + FatalError("Cannot allocate space for the log file name\n"); + } + free(suffix); - if ((asprintf(&suffix, backup, idstring) == -1) || - (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1)) { - FatalError("Cannot allocate space for the log file name\n"); - } - free(suffix); - - if (rename(logFileName, oldLog) == -1) { - FatalError("Cannot move old log file \"%s\" to \"%s\"\n", - logFileName, oldLog); + if (renameat(AT_FDCWD, logFileName, AT_FDCWD, oldLog) == -1) { + FatalError("Cannot move old log file \"%s\" to \"%s\"\n", + logFileName, oldLog); + } + free(oldLog); } free(oldLog); + close(fd); } } else {