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;
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))
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);
}
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 {