Tweak to r250117 and change to use ErrorOr and drop isSizeValid for
[oota-llvm.git] / lib / Object / Archive.cpp
index b0e0881c78991c7c0c51807617048a6276fa7f8e..667732baa279ebcfcfe668a54c33a6969496f5fa 100644 (file)
@@ -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 {