diff options
| author | George Rimar <grimar@accesssoftek.com> | 2016-10-07 08:51:57 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2016-10-07 08:51:57 +0000 |
| commit | b7aec331255e7be93652dfad94e817fd8b7be0b8 (patch) | |
| tree | 970bfe15c79ce9a95934faa0e36e61c5797bf9c2 | |
| parent | d9edde4ae2cd3e5350c3a981f6715de9f2457196 (diff) | |
| download | bcm5719-llvm-b7aec331255e7be93652dfad94e817fd8b7be0b8.tar.gz bcm5719-llvm-b7aec331255e7be93652dfad94e817fd8b7be0b8.zip | |
[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
| -rw-r--r-- | lld/ELF/Error.cpp | 4 | ||||
| -rw-r--r-- | lld/ELF/Error.h | 1 | ||||
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 2 | ||||
| -rw-r--r-- | lld/test/ELF/invalid/Inputs/too-short.elf | bin | 0 -> 44 bytes | |||
| -rw-r--r-- | lld/test/ELF/invalid/too-short.s | 5 |
5 files changed, 11 insertions, 1 deletions
diff --git a/lld/ELF/Error.cpp b/lld/ELF/Error.cpp index 4649331a8f9..729888e195e 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 61a0aeb1b1d..83392bdf2eb 100644 --- a/lld/ELF/Error.h +++ b/lld/ELF/Error.h @@ -45,6 +45,7 @@ template <typename T> void error(const ErrorOr<T> &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 <class T> T check(ErrorOr<T> E) { if (auto EC = E.getError()) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index e8f2beed5d0..5b0ce109789 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -57,7 +57,7 @@ template <class ELFT> static ELFFile<ELFT> createELFObj(MemoryBufferRef MB) { std::error_code EC; ELFFile<ELFT> 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 Binary files differnew file mode 100644 index 00000000000..077f392f1dc --- /dev/null +++ b/lld/test/ELF/invalid/Inputs/too-short.elf diff --git a/lld/test/ELF/invalid/too-short.s b/lld/test/ELF/invalid/too-short.s new file mode 100644 index 00000000000..10bc429fc78 --- /dev/null +++ b/lld/test/ELF/invalid/too-short.s @@ -0,0 +1,5 @@ +# REQUIRES: x86 + +## too-short.elf file is a truncated ELF. +# RUN: not ld.lld %S/Inputs/too-short.elf -o %t 2>&1 | FileCheck %s +# CHECK: failed to read |

