From 1c1add44b6114270214c117c2991360f3b8a726a Mon Sep 17 00:00:00 2001
From: Kevin Enderby <enderby@apple.com>
Date: Tue, 13 Oct 2015 20:48:04 +0000
Subject: [PATCH] =?UTF-8?q?Tweak=20to=20r250117=20and=20change=20to=20use?=
 =?UTF-8?q?=20ErrorOr=20and=20drop=20isSizeValid=20for=20ArchiveMemberHead?=
 =?UTF-8?q?er,=20suggestion=20by=20Rafael=20Esp=C3=ADndola.?=
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/include/llvm/Object/Archive.h            |  3 +-
 llvm/lib/Object/Archive.cpp                   | 29 ++++++++-----------
 .../llvm-objdump/X86/malformed-machos.test    |  7 -----
 3 files changed, 13 insertions(+), 26 deletions(-)

diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h
index 5271dde5721e..32c72a0cc3d3 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -37,8 +37,7 @@ struct ArchiveMemberHeader {
   llvm::StringRef getName() const;
 
   /// Members are not larger than 4GB.
-  uint32_t getSize() const;
-  bool isSizeValid() const;
+  ErrorOr<uint32_t> getSize() 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 b0e0881c7899..667732baa279 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<uint32_t> 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<const ArchiveMemberHeader *>(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<uint32_t> 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<uint32_t> Size = getHeader()->getSize();
+  if (Size.getError())
+    return 0;
+  return Size.get();
 }
 
 bool Archive::Child::isThinMember() const {
diff --git a/llvm/test/tools/llvm-objdump/X86/malformed-machos.test b/llvm/test/tools/llvm-objdump/X86/malformed-machos.test
index c98d08ca21d6..a47e43443c5d 100644
--- a/llvm/test/tools/llvm-objdump/X86/malformed-machos.test
+++ b/llvm/test/tools/llvm-objdump/X86/malformed-machos.test
@@ -39,10 +39,3 @@
 # RUN:   | FileCheck -check-prefix=m0337 %s 
 
 # m0337: subq	$16, %rsp
-
-# RUN: llvm-objdump -arch x86_64 -macho -disassemble \
-# RUN:   %p/Inputs/malformed-machos/00000031.a \
-# RUN:   | FileCheck -check-prefix=0031a %s
-
-# 0031a: Archive
-