From 1311b36acea0ac0d94c23452fcb0109bb18373cb Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Thu, 23 Jan 2025 03:57:19 -0800 Subject: [PATCH] [llvm][Support] Put back filename into FileToRemoveList (#124065) Prevents avoidable memory leaks. Looks like exchange added in aa1333a91f8d8a060bcf5b14aa32a6e8bab74e8c didn't take "continue" into account. ``` ==llc==2150782==ERROR: LeakSanitizer: detected memory leaks Direct leak of 10 byte(s) in 1 object(s) allocated from: #0 0x5f1b0f9ac14a in strdup llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:593:3 #1 0x5f1b1768428d in FileToRemoveList llvm-project/llvm/lib/Support/Unix/Signals.inc:105:55 ``` --- llvm/lib/Support/Unix/Signals.inc | 34 +++++++++++++++++-------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc index 330b5d26fa50b..9a12663228a36 100644 --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -149,6 +149,24 @@ public: } } + static void removeFile(char *path) { + // Get the status so we can determine if it's a file or directory. If we + // can't stat the file, ignore it. + struct stat buf; + if (stat(path, &buf) != 0) + return; + + // If this is not a regular file, ignore it. We want to prevent removal + // of special files like /dev/null, even if the compiler is being run + // with the super-user permissions. + if (!S_ISREG(buf.st_mode)) + return; + + // Otherwise, remove the file. We ignore any errors here as there is + // nothing else we can do. + unlink(path); + } + // Signal-safe. static void removeAllFiles(std::atomic &Head) { // If cleanup were to occur while we're removing files we'd have a bad time. @@ -162,21 +180,7 @@ public: // If erasing was occuring while we're trying to remove files we'd look // at free'd data. Take away the path and put it back when done. if (char *path = currentFile->Filename.exchange(nullptr)) { - // Get the status so we can determine if it's a file or directory. If we - // can't stat the file, ignore it. - struct stat buf; - if (stat(path, &buf) != 0) - continue; - - // If this is not a regular file, ignore it. We want to prevent removal - // of special files like /dev/null, even if the compiler is being run - // with the super-user permissions. - if (!S_ISREG(buf.st_mode)) - continue; - - // Otherwise, remove the file. We ignore any errors here as there is - // nothing else we can do. - unlink(path); + removeFile(path); // We're done removing the file, erasing can safely proceed. currentFile->Filename.exchange(path);