From 903955451efae876b524d95c3a72b08ac977fc6d Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Mon, 12 Oct 2015 22:04:54 +0000 Subject: 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. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rdar://22983603 llvm-svn: 250117 --- llvm/lib/Object/Archive.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'llvm/lib/Object/Archive.cpp') 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(Data.data()); + if (!Header->isSizeValid()) + return; if (!isThinMember()) { Size += getRawSize(); Data = StringRef(Start, Size); -- cgit v1.2.3