[llvm] [llvm][Support] Put back filename into FileToRemoveList (PR #124065)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 22 20:53:44 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
Author: Vitaly Buka (vitalybuka)
<details>
<summary>Changes</summary>
Prevents avoidable memory leaks.
Looks like exchange added in aa1333a91f8d8a060bcf5b14aa32a6e8bab74e8c didn't
take "continue" into account.
---
Full diff: https://github.com/llvm/llvm-project/pull/124065.diff
1 Files Affected:
- (modified) llvm/lib/Support/Unix/Signals.inc (+19-15)
``````````diff
diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc
index 330b5d26fa50be..9a12663228a368 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<FileToRemoveList *> &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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/124065
More information about the llvm-commits
mailing list