Skip to content

Commit

Permalink
[llvm][Support] Put back filename into FileToRemoveList (llvm#124065)
Browse files Browse the repository at this point in the history
Prevents avoidable memory leaks.

Looks like exchange added in aa1333a
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
```
  • Loading branch information
vitalybuka authored Jan 23, 2025
1 parent 4f26edd commit 1311b36
Showing 1 changed file with 19 additions and 15 deletions.
34 changes: 19 additions & 15 deletions llvm/lib/Support/Unix/Signals.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);
Expand Down

0 comments on commit 1311b36

Please sign in to comment.