mirror of
https://github.com/intel/llvm.git
synced 2026-01-29 12:53:33 +08:00
Fix memory leak in FileArchive::find().
Patch from George Rimar! llvm-svn: 248525
This commit is contained in:
@@ -45,8 +45,15 @@ public:
|
||||
|
||||
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 (!_file->hasAtoms())
|
||||
return nullptr;
|
||||
|
||||
// If atoms were added - return the file but also store it for later
|
||||
// destruction.
|
||||
File *result = _file.get();
|
||||
_returnedFiles.push_back(std::move(_file));
|
||||
return result;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -57,6 +64,7 @@ private:
|
||||
// reversed destruction order.
|
||||
llvm::BumpPtrAllocator _alloc;
|
||||
unique_bump_ptr<SymbolFile<ELFT>> _file;
|
||||
std::vector<unique_bump_ptr<SymbolFile<ELFT>>> _returnedFiles;
|
||||
};
|
||||
|
||||
} // end anon namespace
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "lld/Core/LLVM.h"
|
||||
#include "lld/Core/LinkingContext.h"
|
||||
#include "lld/Core/Parallel.h"
|
||||
#include "lld/Driver/Driver.h"
|
||||
#include "llvm/ADT/Hashing.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Object/Archive.h"
|
||||
@@ -76,8 +77,11 @@ public:
|
||||
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 @@ private:
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user