summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-10-07 08:51:57 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-10-07 08:51:57 +0000
commitb7aec331255e7be93652dfad94e817fd8b7be0b8 (patch)
tree970bfe15c79ce9a95934faa0e36e61c5797bf9c2
parentd9edde4ae2cd3e5350c3a981f6715de9f2457196 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--lld/ELF/Error.h1
-rw-r--r--lld/ELF/InputFiles.cpp2
-rw-r--r--lld/test/ELF/invalid/Inputs/too-short.elfbin0 -> 44 bytes
-rw-r--r--lld/test/ELF/invalid/too-short.s5
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
new file mode 100644
index 00000000000..077f392f1dc
--- /dev/null
+++ b/lld/test/ELF/invalid/Inputs/too-short.elf
Binary files differ
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
OpenPOWER on IntegriCloud