r209935 - cc1as: fix a potential leak and unremoved output file in error conditions
Alp Toker
alp at nuanti.com
Fri May 30 17:02:21 PDT 2014
Author: alp
Date: Fri May 30 19:02:21 2014
New Revision: 209935
URL: http://llvm.org/viewvc/llvm-project?rev=209935&view=rev
Log:
cc1as: fix a potential leak and unremoved output file in error conditions
Modified:
cfe/trunk/tools/driver/cc1as_main.cpp
Modified: cfe/trunk/tools/driver/cc1as_main.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1as_main.cpp?rev=209935&r1=209934&r2=209935&view=diff
==============================================================================
--- cfe/trunk/tools/driver/cc1as_main.cpp (original)
+++ cfe/trunk/tools/driver/cc1as_main.cpp Fri May 30 19:02:21 2014
@@ -266,6 +266,7 @@ static formatted_raw_ostream *GetOutputS
if (!Error.empty()) {
Diags.Report(diag::err_fe_unable_to_open_output)
<< Opts.OutputPath << Error;
+ delete Out;
return 0;
}
@@ -276,24 +277,23 @@ static bool ExecuteAssembler(AssemblerIn
DiagnosticsEngine &Diags) {
// Get the target specific parser.
std::string Error;
- const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error));
+ const Target *TheTarget = TargetRegistry::lookupTarget(Opts.Triple, Error);
if (!TheTarget) {
Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;
return false;
}
- std::unique_ptr<MemoryBuffer> BufferPtr;
- if (error_code ec = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, BufferPtr)) {
+ std::unique_ptr<MemoryBuffer> Buffer;
+ if (error_code ec = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, Buffer)) {
Error = ec.message();
Diags.Report(diag::err_fe_error_reading) << Opts.InputFile;
return false;
}
- MemoryBuffer *Buffer = BufferPtr.release();
SourceMgr SrcMgr;
// Tell SrcMgr about this buffer, which is what the parser will pick up.
- SrcMgr.AddNewSourceBuffer(Buffer, SMLoc());
+ SrcMgr.AddNewSourceBuffer(Buffer.release(), SMLoc());
// Record the location of the include directories so that the lexer can find
// it later.
@@ -311,7 +311,8 @@ static bool ExecuteAssembler(AssemblerIn
MAI->setCompressDebugSections(true);
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
- formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary);
+ std::unique_ptr<formatted_raw_ostream> Out(
+ GetOutputStream(Opts, Diags, IsBinary));
if (!Out)
return false;
@@ -380,6 +381,8 @@ static bool ExecuteAssembler(AssemblerIn
Str.get()->InitSections();
}
+ bool Success = true;
+
std::unique_ptr<MCAsmParser> Parser(
createMCAsmParser(SrcMgr, Ctx, *Str.get(), *MAI));
@@ -389,17 +392,18 @@ static bool ExecuteAssembler(AssemblerIn
TheTarget->createMCAsmParser(*STI, *Parser, *MCII, Options));
if (!TAP) {
Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;
- return false;
+ Success = false;
}
- Parser->setTargetParser(*TAP.get());
-
- bool Success = !Parser->Run(Opts.NoInitialTextSection);
+ if (Success) {
+ Parser->setTargetParser(*TAP.get());
+ Success = !Parser->Run(Opts.NoInitialTextSection);
+ }
- // Close the output.
- delete Out;
+ // Close the output stream early.
+ Out.reset();
- // Delete output on errors.
+ // Delete output file if there were errors.
if (!Success && Opts.OutputPath != "-")
sys::fs::remove(Opts.OutputPath);
More information about the cfe-commits
mailing list