From b7aec331255e7be93652dfad94e817fd8b7be0b8 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Fri, 7 Oct 2016 08:51:57 +0000 Subject: [PATCH] [ELF] - Do not crash when unable to parse ELF object file. createELFObj() may call error(...), for example when file is too short. In that case header is not set and following line lead to crash: EMachine = ELFObj.getHeader()->e_machine; Patch fixes the issue. Differential revision: https://reviews.llvm.org/D25233 llvm-svn: 283532 --- lld/ELF/Error.cpp | 4 ++++ lld/ELF/Error.h | 1 + lld/ELF/InputFiles.cpp | 2 +- lld/test/ELF/invalid/Inputs/too-short.elf | Bin 0 -> 44 bytes lld/test/ELF/invalid/too-short.s | 5 +++++ 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/invalid/Inputs/too-short.elf create mode 100644 lld/test/ELF/invalid/too-short.s diff --git a/lld/ELF/Error.cpp b/lld/ELF/Error.cpp index 4649331..729888e 100644 --- a/lld/ELF/Error.cpp +++ b/lld/ELF/Error.cpp @@ -47,4 +47,8 @@ void elf::fatal(const Twine &Msg) { exit(1); } +void elf::fatal(std::error_code EC, const Twine &Prefix) { + fatal(Prefix + ": " + EC.message()); +} + } // namespace lld diff --git a/lld/ELF/Error.h b/lld/ELF/Error.h index 61a0aeb..83392bd 100644 --- a/lld/ELF/Error.h +++ b/lld/ELF/Error.h @@ -45,6 +45,7 @@ template void error(const ErrorOr &V, const Twine &Prefix) { } LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg); +LLVM_ATTRIBUTE_NORETURN void fatal(std::error_code EC, const Twine &Prefix); template T check(ErrorOr E) { if (auto EC = E.getError()) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index e8f2bee..5b0ce10 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -57,7 +57,7 @@ template static ELFFile createELFObj(MemoryBufferRef MB) { std::error_code EC; ELFFile F(MB.getBuffer(), EC); if (EC) - error(EC, "failed to read " + MB.getBufferIdentifier()); + fatal(EC, "failed to read " + MB.getBufferIdentifier()); return F; } diff --git a/lld/test/ELF/invalid/Inputs/too-short.elf b/lld/test/ELF/invalid/Inputs/too-short.elf new file mode 100644 index 0000000000000000000000000000000000000000..077f392f1dc4dda9e934b9cb22da021e02d33ece GIT binary patch literal 44 wcmb<-^>JfjWMp8NGl4-!o*^-dVR33kd|FYWBm+YV1H=D+uNV{&1 | FileCheck %s +# CHECK: failed to read -- 2.7.4