[PATCH] D13061: [Bug 21681] - Fixed: Memory leak in FileArchive::find()
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 11:06:42 PDT 2015
grimar created this revision.
grimar added a reviewer: ruiu.
grimar added subscribers: llvm-commits, grimar.
grimar added a project: lld.
There were 5 subclasses of ArchiveLibraryFile in total and two of them required the fix imo.
http://reviews.llvm.org/D13061
Files:
ReaderWriter/ELF/OutputELFWriter.cpp
ReaderWriter/FileArchive.cpp
Index: ReaderWriter/FileArchive.cpp
===================================================================
--- ReaderWriter/FileArchive.cpp
+++ ReaderWriter/FileArchive.cpp
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "lld/Driver/Driver.h"
#include "lld/Core/ArchiveLibraryFile.h"
#include "lld/Core/LLVM.h"
#include "lld/Core/LinkingContext.h"
@@ -76,8 +77,11 @@
if (instantiateMember(ci, result))
return nullptr;
- // give up the pointer so that this object no longer manages it
- return result.release();
+ File *file = result.get();
+ _filesReturned.push_back(std::move(result));
+
+ // Give up the file pointer. It was stored and will be destroyed with destruction of FileArchive
+ return file;
}
// Instantiate a member file containing a given symbol name.
@@ -259,6 +263,7 @@
std::vector<std::unique_ptr<MemoryBuffer>> _memberBuffers;
std::map<const char *, std::unique_ptr<Future<File *>>> _preloaded;
std::mutex _mutex;
+ FileVector _filesReturned;
};
class ArchiveReader : public Reader {
Index: ReaderWriter/ELF/OutputELFWriter.cpp
===================================================================
--- ReaderWriter/ELF/OutputELFWriter.cpp
+++ ReaderWriter/ELF/OutputELFWriter.cpp
@@ -45,8 +45,15 @@
assert(!_file->hasAtoms() && "The file shouldn't have atoms yet");
_resolver(sym, *_file);
- // If atoms were added - release the file to the caller.
- return _file->hasAtoms() ? _file.release() : nullptr;
+
+ // If atoms were added - return the file but also store it for later destruction
+ if (_file->hasAtoms()) {
+ File *result = _file.get();
+ _returnedFiles.push_back(std::move(_file));
+ return result;
+ }
+
+ return nullptr;
}
private:
@@ -57,6 +64,7 @@
// reversed destruction order.
llvm::BumpPtrAllocator _alloc;
unique_bump_ptr<SymbolFile<ELFT>> _file;
+ std::vector<unique_bump_ptr<SymbolFile<ELFT>>> _returnedFiles;
};
} // end anon namespace
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D13061.35396.patch
Type: text/x-patch
Size: 2110 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150922/c3488a34/attachment.bin>
More information about the llvm-commits
mailing list