From 1c1add44b6114270214c117c2991360f3b8a726a Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Tue, 13 Oct 2015 20:48:04 +0000 Subject: Tweak to r250117 and change to use ErrorOr and drop isSizeValid for ArchiveMemberHeader, suggestion by Rafael EspĂ­ndola. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also The clang-x86-win2008-selfhost bot still does not like the malformed-machos 00000031.a test, so removing it for now. All the other bots are fine with it however. llvm-svn: 250222 --- llvm/lib/Object/Archive.cpp | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) (limited to 'llvm/lib/Object/Archive.cpp') diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index b0e0881c789..667732baa27 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -43,20 +43,13 @@ StringRef ArchiveMemberHeader::getName() const { return llvm::StringRef(Name, end); } -uint32_t ArchiveMemberHeader::getSize() const { +ErrorOr ArchiveMemberHeader::getSize() const { uint32_t Ret; if (llvm::StringRef(Size, sizeof(Size)).rtrim(" ").getAsInteger(10, Ret)) - llvm_unreachable("Size is not a decimal number."); + return object_error::parse_failed; 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)) @@ -96,11 +89,6 @@ 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); @@ -119,13 +107,20 @@ Archive::Child::Child(const Archive *Parent, const char *Start) } uint64_t Archive::Child::getSize() const { - if (Parent->IsThin) - return getHeader()->getSize(); + if (Parent->IsThin) { + ErrorOr Size = getHeader()->getSize(); + if (Size.getError()) + return 0; + return Size.get(); + } return Data.size() - StartOfFile; } uint64_t Archive::Child::getRawSize() const { - return getHeader()->getSize(); + ErrorOr Size = getHeader()->getSize(); + if (Size.getError()) + return 0; + return Size.get(); } bool Archive::Child::isThinMember() const { -- cgit v1.2.3