forked from OSchip/llvm-project
[Clang][Bundler] Fix for a potential memory leak [NFC]
Bundler leaks memory if it is called with -type=o but given input isn't an object file (though it has to have a known binary type like IR, archive, etc...). Memory leak is happening when binary object returned by the createBinary(...) call cannot be casted to an ObjectFile type. In this case returned BinaryOrErr object releases ownership of the binary, but no one is taking it (see line 626). Differential Revision: https://reviews.llvm.org/D67416 llvm-svn: 371633
This commit is contained in:
parent
1be634044d
commit
0c1257f517
|
@ -611,24 +611,15 @@ static FileHandler *CreateObjectFileHandler(MemoryBuffer &FirstInput) {
|
|||
// Check if the input file format is one that we know how to deal with.
|
||||
Expected<std::unique_ptr<Binary>> BinaryOrErr = createBinary(FirstInput);
|
||||
|
||||
// Failed to open the input as a known binary. Use the default binary handler.
|
||||
if (!BinaryOrErr) {
|
||||
// We don't really care about the error (we just consume it), if we could
|
||||
// not get a valid device binary object we use the default binary handler.
|
||||
consumeError(BinaryOrErr.takeError());
|
||||
return new BinaryFileHandler();
|
||||
}
|
||||
|
||||
// We only support regular object files. If this is not an object file,
|
||||
// default to the binary handler. The handler will be owned by the client of
|
||||
// this function.
|
||||
std::unique_ptr<ObjectFile> Obj(
|
||||
dyn_cast<ObjectFile>(BinaryOrErr.get().release()));
|
||||
|
||||
if (!Obj)
|
||||
// We only support regular object files. If failed to open the input as a
|
||||
// known binary or this is not an object file use the default binary handler.
|
||||
if (errorToBool(BinaryOrErr.takeError()) || !isa<ObjectFile>(*BinaryOrErr))
|
||||
return new BinaryFileHandler();
|
||||
|
||||
return new ObjectFileHandler(std::move(Obj));
|
||||
// Otherwise create an object file handler. The handler will be owned by the
|
||||
// client of this function.
|
||||
return new ObjectFileHandler(
|
||||
std::unique_ptr<ObjectFile>(cast<ObjectFile>(BinaryOrErr->release())));
|
||||
}
|
||||
|
||||
/// Return an appropriate handler given the input files and options.
|
||||
|
|
Loading…
Reference in New Issue