[PATCH] Fixed double-free in case of module loading error.

David Blaikie dblaikie at gmail.com
Fri May 8 15:19:33 PDT 2015


On Fri, May 8, 2015 at 3:11 PM, Artem Belevich <tra at google.com> wrote:

> Hi echristo, rnk, dblaikie,
>
>
> GetOutputStream() owns the stream it returns pointer to and the
> pointer should never be freed by us. When we fail to load and exit
> early, unique_ptr still holds the pointer and frees it which leads to
> compiler crash when CompilerInstance attempts to free it again.
>
> Added regression test for failed bitcode linking.
>
> http://reviews.llvm.org/D9625
>
> Files:
>   lib/CodeGen/CodeGenAction.cpp
>   test/CodeGen/link-bitcode-file.c
>
> Index: lib/CodeGen/CodeGenAction.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenAction.cpp
> +++ lib/CodeGen/CodeGenAction.cpp
> @@ -629,7 +629,7 @@
>  std::unique_ptr<ASTConsumer>
>  CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
>    BackendAction BA = static_cast<BackendAction>(Act);
> -  std::unique_ptr<raw_pwrite_stream> OS(GetOutputStream(CI, InFile, BA));
> +  raw_pwrite_stream *OS(GetOutputStream(CI, InFile, BA));
>

Use = rather than () where both are valid (such as here):

raw_pwrite_stream *OS = GetOutputStream(...);

Otherwise looks good.

If you wanted to do some cleanup, perhaps GetOutputStream should return by
reference so there's no confusion about ownership passing.


>    if (BA != Backend_EmitNothing && !OS)
>      return nullptr;
>
> @@ -666,7 +666,7 @@
>    std::unique_ptr<BackendConsumer> Result(new BackendConsumer(
>        BA, CI.getDiagnostics(), CI.getCodeGenOpts(), CI.getTargetOpts(),
>        CI.getLangOpts(), CI.getFrontendOpts().ShowTimers, InFile,
> -      LinkModuleToUse, OS.release(), *VMContext, CoverageInfo));
> +      LinkModuleToUse, OS, *VMContext, CoverageInfo));
>    BEConsumer = Result.get();
>    return std::move(Result);
>  }
> Index: test/CodeGen/link-bitcode-file.c
> ===================================================================
> --- test/CodeGen/link-bitcode-file.c
> +++ test/CodeGen/link-bitcode-file.c
> @@ -1,6 +1,9 @@
>  // RUN: %clang_cc1 -triple i386-pc-linux-gnu -DBITCODE -emit-llvm-bc -o
> %t.bc %s
>  // RUN: %clang_cc1 -triple i386-pc-linux-gnu -mlink-bitcode-file %t.bc
> -O3 -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NO-BC %s
>  // RUN: not %clang_cc1 -triple i386-pc-linux-gnu -DBITCODE
> -mlink-bitcode-file %t.bc -O3 -emit-llvm -o - %s 2>&1 | FileCheck
> -check-prefix=CHECK-BC %s
> +// Make sure we deal with failure to load the file.
> +// RUN: not %clang_cc1 -triple i386-pc-linux-gnu -mlink-bitcode-file
> no-such-file.bc \
> +// RUN:    -emit-llvm -o - %s 2>&1 | FileCheck
> -check-prefix=CHECK-NO-FILE %s
>
>  int f(void);
>
> @@ -22,3 +25,5 @@
>  // CHECK-NO-BC-LABEL: define i32 @f
>
>  #endif
> +
> +// CHECK-NO-FILE: fatal error: cannot open file 'no-such-file.bc'
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150508/d5dffcd5/attachment.html>


More information about the cfe-commits mailing list