diff options
author | Kevin Enderby <enderby@apple.com> | 2015-10-12 22:04:54 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2015-10-12 22:04:54 +0000 |
commit | 903955451efae876b524d95c3a72b08ac977fc6d (patch) | |
tree | 2a008f087fa277865e843679792e03e2d21ee3b7 | |
parent | dc48412c938f39d51b8980db9f957cab30af671e (diff) | |
download | bcm5719-llvm-903955451efae876b524d95c3a72b08ac977fc6d.tar.gz bcm5719-llvm-903955451efae876b524d95c3a72b08ac977fc6d.zip |
Fixed bugs in llvm-obdump while parsing Mach-O files from malformed archives
that caused aborts. This was because of the characters of the ‘Size’ field in
the archive header did not contain decimal characters.
rdar://22983603
llvm-svn: 250117
-rw-r--r-- | llvm/include/llvm/Object/Archive.h | 1 | ||||
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 12 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a | bin | 0 -> 2768 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-objdump/X86/malformed-machos.test | 6 |
4 files changed, 19 insertions, 0 deletions
diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index d7f46551827..5271dde5721 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -38,6 +38,7 @@ struct ArchiveMemberHeader { /// Members are not larger than 4GB. uint32_t getSize() const; + bool isSizeValid() const; sys::fs::perms getAccessMode() const; sys::TimeValue getLastModified() const; diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 42fec39851d..b0e0881c789 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -50,6 +50,13 @@ uint32_t ArchiveMemberHeader::getSize() const { return Ret; } +bool ArchiveMemberHeader::isSizeValid() const { + uint32_t Ret; + if (llvm::StringRef(Size, sizeof(Size)).rtrim(" ").getAsInteger(10, Ret)) + return false; + return true; +} + sys::fs::perms ArchiveMemberHeader::getAccessMode() const { unsigned Ret; if (StringRef(AccessMode, sizeof(AccessMode)).rtrim(" ").getAsInteger(8, Ret)) @@ -89,6 +96,11 @@ Archive::Child::Child(const Archive *Parent, const char *Start) uint64_t Size = sizeof(ArchiveMemberHeader); Data = StringRef(Start, Size); + // Check to make sure the size is valid. + const ArchiveMemberHeader *Header = + reinterpret_cast<const ArchiveMemberHeader *>(Data.data()); + if (!Header->isSizeValid()) + return; if (!isThinMember()) { Size += getRawSize(); Data = StringRef(Start, Size); diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a b/llvm/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a Binary files differnew file mode 100644 index 00000000000..b784d8163f5 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a diff --git a/llvm/test/tools/llvm-objdump/X86/malformed-machos.test b/llvm/test/tools/llvm-objdump/X86/malformed-machos.test index a47e43443c5..c5778ed6f30 100644 --- a/llvm/test/tools/llvm-objdump/X86/malformed-machos.test +++ b/llvm/test/tools/llvm-objdump/X86/malformed-machos.test @@ -39,3 +39,9 @@ # RUN: | FileCheck -check-prefix=m0337 %s # m0337: subq $16, %rsp + +# RUN: llvm-objdump -macho -disassemble \ +# RUN: %p/Inputs/malformed-machos/00000031.a \ +# RUN: | FileCheck -check-prefix=0031a %s + +# 0031a: Archive |